另一份有点难的 iOS 面试题

4,268
原文链接: t.cn

这一年的时间已经经历了实习、校招好几次的面试了,对于每个准备找工作或者已经找到工作的人来说,准备面试题都是一次提升自己的机会。但比较庆幸的是,本人几次面试所遇到的问题都比较简单,没有太多能让自己有所提升的内容,而网上流传的各种面试题如今看来也没有什么太大的新意。因此我决定自己出一份面试题,真正有一点难度的面试题。

对于我个人来说,我不太喜欢那些查一查就能得到答案的题目,比如某个 API 怎么用,或者某个数据结构怎么写等等,因为这些题目其实考察都是肌肉记忆,就算答得好也不代表这个人能力很强,只能说他前期准备工作做得比较好。我下面所提出的几个问题都是需要一定实践或者一定经验才能流畅解答出来的题目,如果这些问题对你来说 so easy,那么说明你有一定的知识广度,对问题比较喜欢深入探究。当然了,如果你觉得某几个问题有些许难度,也没有太大的关系,能够说出一个大致的思路也是 ok 的,后期再慢慢摸索一下对自己也是有极大提升的。

下面就来看看我的问题吧!

涵盖的知识体系

  • UIKit 相关的基础知识
  • C++ 以及与 Objective-C 的互操作性(没有接触过 C++ 的小伙伴可以暂时跳过这部分题目)
  • 程序链接与装载相关知识
  • Swift
  • Objective-C runtime
  • 计算机网络(基础)
  • 操作系统(基础)

面试题

  1. 详细描述一下 UIViewCALayer 的关系,drawRect 一定会影响性能吗?UI DynamicsUIKit Animation 的最本质区别是什么?
  2. 如何用 UIImageView 显示超大分辨率的图?如果要支持缩放呢?
  3. 了解 fishhook 吗?说说为什么 fishhook 不能修改非动态连接库中的符号?
  4. C++ 调用虚方法与 Objective-C 发消息有什么区别?
  5. 了解 placement new 吗?Objective-C 中如何实现这个功能?
  6. 如何在 ARC 环境下用 C++ 标准库容器来管理 Objective-C 对象?
  7. idselfsuper 它们从语法上有什么区别?
  8. isa 是什么?是指向 Class 对象本身的指针吗?
  9. block 修改捕获变量除了用 __block 还可以怎么做?有哪些局限性?
  10. NSDictionaryNSHashTable 有什么区别,它们的使用场景是怎样的?
  11. 用过 Swift 吗?如何评价 String index 的设计?
  12. 假设 iPhone 上有一个与服务器的 TCP 连接,此时 iPhone 忽然断网,服务器能在短时间内知会 iPhone 的离线吗?
  13. 为什么 Wireshark 不能直接抓取 SSL 的原始数据?
  14. backtrace 是在用户态实现的吗?能否讲讲实现它的大致思路?
  15. malloc 的指针 double free 产生的异常与访问 freed 指针有可能产生的异常有什么区别?为什么访问 freed 指针不一定产生异常?
  16. RunLoop 是一个不停歇在运行的死循环吗?为什么?
  17. 看过 runtime 的源码吗?源码中常有的 fastpathslowpath 是什么?
  18. runtime 中 SideTables(不是 SideTable)存在的意义是什么?
  19. 为什么 ARC 环境下不允许我们调用 [super dealloc]
  20. Objective-C 是如何保证系统升级后的 ABI 稳定性的?
  21. 下面这段伪代码存在什么问题?应该如何改进?
int main(int argc, const char * argv[]) {
    // ...
    
    NSUInteger threadCount = [NSProcessInfo processInfo].activeProcessorCount;
    NSCondition *cond = [NSCondition new];
    for (int i = 0; i < threadCount; i++) {
        [NSThread detachNewThreadWithBlock:^{
            while (YES) {
                [cond lock];
                while (/* Queue is empty */) {
                    [cond wait];
                }
                // Dequeue an item.
                [cond unlock];
                // Handle the item.
            }
        }];
    }

    while (YES) {
        // Enqueue something when it comes.
        [cond broadcast];
    }
    
    // ...
}
复制代码

虽然只有 21 道题,但相关问题还是很多很多的,日后我可能也会写一篇文章来解答一下所有的问题,当然我更希望大家能够自己完成这些问题,不要尝试直接搜答案,很多题也许根本搜不到答案,所以自己探究的过程一定是必不可少的,加油吧!