经典面试

1、 你使用过Objective-C的运行时编程(Runtime Programming)么?如果使用过,你用它做了什么?你还能记得你所使用的相关的头文件或者某些方法的名称吗?

Objecitve-C的重要特性是Runtime(运行时),在#import
下能看到相关的方法,用过objc_getClass()和class_copyMethodList()获取过私有API;使用
Method method1 = class_getInstanceMethod(cls, sel1);
Method method2 = class_getInstanceMethod(cls, sel2);
method_exchangeImplementations(method1,
method2);
代码交换两个方法,在写unit test时使用到。

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

最大的优点是它的运行时特性,不足是没有命名空间,对于命名冲突,可以使用长命名法或特殊前缀解决,如果是引入的第三方库之间的命名冲突,可以使用link命令及flag解决冲突。

3、 你用过NSOperationQueue么?如果用过或者了解的话,你为什么要使用NSOperationQueue,实现了什么?请描述它和GCD的区别和类似的地方(提示:可以从两者的实现机制和适用范围来描述)。

使用NSOperationQueue用来管理子类化的NSOperation对象,控制其线程并发数目。GCD和NSOperation都可以实现对线程的管理,区别是NSOperation和NSOperationQueue是多线程的面向对象抽象。项目中使用NSOperation的优点是NSOperation是对线程的高度抽象,在项目中使用它,会使项目的程序结构更好,子类化NSOperation的设计思路,是具有面向对象的优点(复用、封装),使得实现是多线程支持,而接口简单,建议在复杂项目中使用。
项目中使用GCD的优点是GCD本身非常简单、易用,对于不复杂的多线程操作,会节省代码量,而Block参数的使用,会是代码更为易读,建议在简单项目中使用。
更详细的答案见我的这篇文章

4、NSNotification和KVO的区别和用法是什么?什么时候应该使用通知,什么时候应该使用KVO,它们的实现上有什么区别吗?如果用protocol和delegate(或者delegate的Array)来实现类似的功能可能吗?如果可能,会有什么潜在的问题?如果不能,为什么?(虽然protocol和delegate这种东西面试已经面烂了…)

NSNotification是通知模式在iOS的实现,KVO的全称是键值观察(Key-value
observing),其是基于KVC(key-value coding)的,KVC是一个通过属性名访问属性变量的机制。例如将Module层的变化,通知到多个Controller对象时,可以使用NSNotification;如果是只需要观察某个对象的某个属性,可以使用KVO。
对于委托模式,在设计模式中是对象适配器模式,其是delegate是指向某个对象的,这是一对一的关系,而在通知模式中,往往是一对多的关系。委托模式,从技术上可以现在改变delegate指向的对象,但不建议这样做,会让人迷惑,如果一个delegate对象不断改变,指向不同的对象。

5、如何把一张大图缩小为1/4大小的缩略图?
let data = UIImageJPEGRepresentation(image, 0.25)

6、NSOperation 相比于GCD 有哪些优势?

提供了在GCD 中不那么容易复制的有用特性。
可以很方便的取消一个NSOperation的执行
可以更容易的添加任务的依赖关系
提供了任务的状态:isExecuteing, isFinished.

7、SDWebImage具体如何实现?

其实就是沙盒缓存机制,主要由三块组成:内存图片缓存,内存操作缓存,磁盘沙盒缓存。
①、利用NSOperationQueue和NSOperation下载图片,还使用了GCD(解析GIF图片)。
②、利用URL作为key,NSOperation作为value.
③、利用URL作为key,UIImage作为value

8、AFNetWorking实现原理。

基于NSURL.采用block的方法处理请求,直接返回的是json、XML数据。AFN直接操作对象是AFHTTPClient,是一个实现了NSCoding和NSCopying协议的NSObject子类。AFGTTPClient是一个封装了一系列操作方法的工具类。AFN默认没有封装同步请求,如果开发者需要使用同步请求,需要重写相关的方法(getPath:parameters:failure),对AFHTTPRequestOperation进行同步处理。

9、App需要加载大量数据,给服务器发送请求,但是服务器卡住了怎么办?

设置请求超时,给用户提示请求超时,根据用户操作再次请求。

10、有些图片加载比较慢怎么处理?你是怎么优化程序的性能的?

①、图片下载放在异步线程。
②、图片下载过程使用占位图片
③、如果图片比较大,可以使用多线程断点下载。

11、怎么解决缓存池满的问题?

iOS中不存在缓存池满的情况,通常在对象需要创建时才创建,比如UITableView中一般只会创建刚开始在屏幕中的cell,之后都是从缓存池里取,不会再创建新对象。

12、控制器View的生命周期及相关函数是什么?你在开发中是如何使用的?

1、首先判断控制器是否有视图,如果没有就调用loadView方法创建:通过storyBoard或者代码。
2、随后调用viewDidLoad,可以进行下一步的初始化操作,只会被调用一次。
3、在视图显示之前调用viewWillAppear,该函数可以多次调用。
4、视图viewDidAppear
5、在布局变化前后,调用viewWill/DidLayoutSubViews处理相关信息。

13、是否使用Core Text 或者Core Image ?

Core Text
随意修改文本的样式
图文混排(纯C语言)
Core Image(滤镜处理)
能够调节图片的各种属性(对比度、色温、色差等)

14、你实现过多线程的Core Data么?NSPersistentStoreCoordinator,NSManagedObjectContext和NSManagedObject中的哪些需要在线程中创建或者传递?你是用什么样的策略来实现的?

15、 您是否做过异步的网络处理和通讯方面的工作?如果有,能具体介绍一些实现策略么?

你可能感兴趣的:(经典面试)