美文网首页
经典面试

经典面试

作者: Mr丶炎 | 来源:发表于2016-09-14 11:16 被阅读20次

    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);
    代码交换两个方法,在写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、 您是否做过异步的网络处理和通讯方面的工作?如果有,能具体介绍一些实现策略么?

    相关文章

      网友评论

          本文标题:经典面试

          本文链接:https://www.haomeiwen.com/subject/tysvettx.html