iOS面试题iOS面试总结iOS面试

iOS面试进阶篇(七)-经典面试题

2019-03-19  本文已影响192人  路飞_Luck
目录
1.你使用过Objective-C的运行时编程(Runtime Programming)么?如果使用过,你用它做了什么?你还能记得你所使用的相关的头文件或者某些方法的名称吗?

Objecitve-C的重要特性是Runtime(运行时),在#import <objc/runtime.h>下能看到相关的方法,用过objc_getClass()和class_copyMethodList()获取过私有API;

使用

Method method1 = class_getInstanceMethod(cls, sel1);
Method method2 = class_getInstanceMethod(cls, sel2);
method_exchangeImplementations(method1, method2);
2.你实现过多线程的Core Data么?NSPersistentStoreCoordinator,NSManagedObjectContext和NSManagedObject中的哪些需要在线程中创建或者传递?你是用什么样的策略来实现的?

待整理!

3.Core开头的系列的内容。是否使用过CoreAnimation和CoreGraphics。UI框架和CA,CG框架的联系是什么?分别用CA和CG做过些什么动画或者图像上的内容。(有需要的话还可以涉及Quartz的一些内容)

待整理

4.是否使用过CoreText或者CoreImage等?如果使用过,请谈谈你使用CoreText或者CoreImage的体验。
5.NSNotification和KVO的区别和用法是什么?什么时候应该使用通知,什么时候应该使用KVO,它们的实现上有什么区别吗?如果用protocol和delegate(或者delegate的Array)来实现类似的功能可能吗?如果可能,会有什么潜在的问题?如果不能,为什么?(虽然protocol和delegate这种东西面试已经面烂了…)
6.你用过NSOperationQueue么?如果用过或者了解的话,你为什么要使用NSOperationQueue,实现了什么?请描述它和GCD的区别和类似的地方(提示:可以从两者的实现机制和适用范围来描述)。

NSOperationQueue

GCD
项目中使用GCD的优点是GCD本身非常简单、易用,对于不复杂的多线程操作,会节省代码量,而Block参数的使用,会是代码更为易读,建议在简单项目中使用。

5.既然提到GCD,那么问一下在使用GCD以及block时要注意些什么?它们两是一回事儿么?block在ARC中和传统的MRC中的行为和用法有没有什么区别,需要注意些什么?如何避免循环引用?
7.您是否做过异步的网络处理和通讯方面的工作?如果有,能具体介绍一些实现策略么?

待整理

8.对于Objective-C,你认为它最大的优点和最大的不足是什么?对于不足之处,现在有没有可用的方法绕过这些不足来实现需求。如果可以的话,你有没有考虑或者实践过重新实现OC的一些功能,如果有,具体会如何做?
9.如何获取通讯录数据

从通讯录数据库查询联系人数据是无法使用SQL语句,只能通过ABAddressBookCopyArrayOfAllPeople、ABAddressBookCopyPeopleWithName来获得。ABAddressBookCopyArrayOfAllPeople函数是通过人名查询通讯录中的联系人,其中的name参数是查询的前缀关键字。

10.NSURLConnection类的同步请求方法?
A.+sendSynchronousRequest:returningResponse:error:
B.-initWithRequest:delegate:
C.-initWithRequest:delegate:startImmediately:

理解:B和C都是异步方法,需要设置delegate属性。

10.genstrings命名的语法
genstrings [-a] [-q] [-o <outputDir>] sourcefile

其中参数:

-a:在存在的文件后面追加内容;
-q:关闭多个键值对的警告;
-o:指定输出目录

因此如果我们想输出到en.lproj目录,则代码如下:

genstrings -o en.lproj *.m
11.判断是否为iPad设备
if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad){....}
12.Objective-C有哪几种内存管理方法?
13.iOS中持久化方式有哪些?
14.关于类别的理解

类别是一种为现有的类添加新方法的方式。利用Objective-C的动态运行时分配机制,Category提供了一种比继承更为简洁的方法来对class进行扩展,无需创建对象类的子类就能为现有的类添加新方法,可以为任何已经存在的class添加方法,包括那些没有源代码的类(比如某些框架类),但不能删除修改之前的方法。

类别主要有3个作用:

15.NSRunLoop的以下描述错误的是
A. RunLoop并不是由系统自动控制的;
B.有3类对象可以被run loop监控:sources,timer,observers
C.线程是默认启动run loop的;
D.NSTimer可手动添加到新建的NSRunLoop中。

理解

16.常用的设计模式
17.MVC的理解

数据管理者(M)、数据展示者(V)、数据加工者(C)

18.MVC和MVVM的区别
19.TCP和UDP有什么区别?
20.TCP的三次握手
21.如何制作一个静态库/动态库?他们的区别是什么?

每一个设备都有属于自己的CPU架构
每一个静态支持的架构是固定

常用命令总结:

使用lipo -info命令,查看指定库支持的架构,比如UIKit框架

lipo -info UIKit.framework/UIKit

想看的更详细的信息可以使用lipo -detailed_info

lipo -detailed_info UIKit.framework/UIKit

还可以使用file命令

file UIKit.framework/UIKit

合并MyLib-32.a和MyLib-64.a,可以使用lipo -create命令合并

lipo -create MyLib-32.a MyLib-64.a -output MyLib.a
22.支持64-bit后程序包会变大么?

会,支持64-bit后,多了一个arm64架构,理论上每个架构一套指令,但相比原来会大多少还不好说

23.用过Core Data或者SQLite吗?读写是分线程的吗?遇到过死锁没?如何解决的?
24.APNS的原理:
上一篇下一篇

猜你喜欢

热点阅读