iOS 面试知识点总结及面试相关tips

iOS面试题总结整理(附答案-持续更新)

2016-03-13  本文已影响1212人  该简书已经停止更新

iOS面试题总结整理(附答案)

  1. 多线程的实现方式;


    iOS中实现多线程的方案有4种
  2. 延迟执行的几种方式;

    • 延迟1秒执行代码
        -(void)delayMethod{
            NSLog(@"delayMethodEnd");
        }
    
    • performSelector方法:
        [self performSelector:@selector(delayMethod) withObject:nil afterDelay:1.0f];
    

    此方式要求必须在主线程中执行,否则无效。
    是一种非阻塞的执行方式,暂时未找到取消执行的方法。

    • 定时器:NSTimer;
        [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(delayMethod) userInfo:nil repeats:NO];
    

    此方式要求必须在主线程中执行,否则无效。
    是一种非阻塞的执行方式,可以通过NSTimer类的- (void)invalidate;取消执行。

    • sleep方式;
        [NSThread sleepForTimeInterval:1.0f]; [self delayMethod];
    

    此方式在主线程和子线程中均执行。
    是一种阻塞的执行方式,建议放到子线程中,以避免卡住界面,没有找到取消执行的方法。

    • GCD方式
        __weak id safeSelf = self;  
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [safeSelf delayMethod];
    });
    

    此方式可以在参数中选择执行的线程。
    是一种非阻塞的执行方式,
    没有找到取消执行的方式。

  3. App崩溃的情况有多少种;

    1. 违反操作系统规则:比如启动恢复挂起退出时watchdog超时,用户强制退出或者低内存终止。
    2. 应用程序异常退出。
  4. 你使用过Objective-C的运行时编程(Runtime Programming)么?如果使用过,你用它做了什么?你还能记得你所使用的相关的头文件或者某些方法的名称吗?
    参考答案:Objecitve-C的重要特性是Runtime(运行时),在#import <objc/runtime.h> 下能看到相关的方法,用过objc_getClass()class_copyMethodList()获取过私有API;
    使用objective-c
    Method method1 = class_getInstanceMethod(cls, sel1);
    Method method2 = class_getInstanceMethod(cls, sel2);
    method_exchangeImplementations(method1, method2);
    代码交换两个方法,在写unit test时使用到。

  5. 对于Objective-C,你认为它最大的优点和最大的不足是什么?对于不足之处,现在有没有可用的方法绕过这些不足来实现需求。如果可以的话,你有没有考虑或者实践过重新实现OC的一些功能,如果有,具体会如何做?
    参考答案:最大的优点是它的运行时特性,不足是没有命名空间,对于命名冲突,可以使用长命名法或特殊前缀解决,如果是引入的第三方库之间的命名冲突,可以使用link命令及flag解决冲突。

  6. iOS中的几种传值问题?

  1. 什么是 ARC? (ARC 是为了解决什么问题而诞生的?)
    ARC 是 Automatic Reference Counting 的缩写, 即自动引用计数. 这是苹果在 iOS5 中引入的内存管理机制. Objective-C 和 Swift 使用 ARC 追踪和管理应用的内存使用. 这一机制使得开发者无需键入 retainrelease
    , 这不仅能够降低程序崩溃和内存泄露的风险, 而且可以减少开发者的工作量, 能够大幅度提升程序的流畅性可预测性. 但是 ARC 不适用于 Core Foundation 框架中, 仍然需要手动管理内存.

  2. 以下 keywords 有什么区别: assign vs weak ,__block vs __weak
    assignweak是用于在声明属性时, 为属性指定内存管理的语义.

__block__weak 之间的却是确实极大的, 不过它们都用于修饰变量.

9 . __block 在 ARC 和非 ARC 下含义一样吗?
__block 在 ARC 下捕获的变量会被 block retain, 这样可能导致循环引用, 所以必须要使用弱引用才能解决该问题.
而在非 ARC 下, 可以直接使用 __block 说明符修饰变量, 因为在非 ARC 下, block 不会 retain 捕获的变量.

10 . viewWillLayoutSubviews 的作用是什么?
`viewWillLayoutSubviews 方法会在视图的 bounds 改变时, 视图会调整子视图的位置, 我们可以在视图控制器中覆写这个方法在视图放置子视图前做出改变, 当屏幕的方向改变时, 这个方法会被调用.

11 . SDWebImage 里面给 UIImageView 加载图片的逻辑是什么样的?
我曾经阅读过 SDWebImage 的源代码, 就在这里对如何给 UIImageView 加载图片做一个总结吧, SDWebImage 中为 UIView 提供了一个分类叫做 WebCache, 这个分类中有一个最常用的接口, sd_setImageWithURL:placeholderImage: , 这个分类同时提供了很多类似的方法, 这些方法最终会调用一个同时具有 option progressBlock completionBlock的方法, 而在这个类最终被调用的方法首先会检查是否传入了 placeholderImage 以及对应的参数, 并设置 placeholderImage .
然后会获取 SDWebImageManager 中的单例调用一个 downloadImageWithURL:... 的方法来获取图片, 而这个 manager 获取图片的过程有大体上分为两部分, 它首先会在 SDWebImageCache 中寻找图片是否有对应的缓存, 它会以 url 作为数据的索引先在内存中寻找是否有对应的缓存, 如果缓存未命中就会在磁盘中利用 MD5 处理过的 key 来继续查询对应的数据, 如果找到了, 就会把磁盘中的缓存备份到内存中.
然而, 假设我们在内存和磁盘缓存中都没有命中, 那么 manager 就会调用它持有的一 个 SDWebImageDownloader 对象的方法 downloadImageWithURL:... 来下载图片, 这个方法会在执行的过程中调用另一个方法 addProgressCallback:andCompletedBlock:fotURL:createCallback: 来存储下载过程中和下载完成的回调, 当回调块是第一次添加的时候, 方法会实例化一个 NSMutableURLRequestSDWebImageDownloaderOperation , 并将后者加入 downloader 持有的下载队列开始图片的异步下载.
而在图片下载完成之后, 就会在主线程设置 image, 完成整个图像的异步下载和配置.

12 . 你一般是怎么用Instruments的?(工作经验的问题,没必要所有都答)
参考答案:

13 . performSelector:withObject:afterDelay: 内部大概是怎么实现的,有什么注意事项么?

14 . 有哪些常见的 Crash 场景?

持续更新...

上一篇 下一篇

猜你喜欢

热点阅读