系列:
【靠谱程序员#6】《招聘一个靠谱的程序员》个人解答(end)
51. apple用什么方式实现对一个对象的KVO?
答:
当你观察一个对象时,一个新的类(NSKVONotifying_原类名,如果我们动态添加了一个这个类,程序会报错,间接证明了这个类是存在的)会被动态创建。这个类继承自该对象的原本的类,并重写了被观察属性的 setter 方法。重写的 setter 方法会负责在调用原 setter 方法之前(保留旧值)和之后(替换新值),通知所有观察对象:值的更改。最后通过 isa 混写(isa-swizzling) 把这个对象的 isa 指针 ( isa 指针告诉 Runtime 系统这个对象的类是什么 ) 指向这个新创建的子类,对象就神奇的变成了新创建的子类的实例,具体过程,如下所示:

52. IBOutlet连出来的视图属性为什么可以被设置成weak?
答:
一般的IBOutlet直接关联到viewcontroller。但是跟其关联的控件并不是添加在controller上,而是添加到controller的view上,比如[self.view addSubView:xxx]; 这个时候self.view已经对xxx 强引用过了,self.view才是持有xxx的对象。这样子才符合引用计数的规则。所以直接IBOutlet和顶级view关联的时候肯定使用了strong。
参考链接: Should IBOutlets be strong or weak under ARC?
53. IB中User Defined Runtime Attributes如何使用?
答:
这个东西就是使用xib写KVC的设置
它能够通过KVC的方式配置一些你在interface builder 中不能配置的属性。当你希望在IB中作尽可能多得事情,这个特性能够帮助你编写更加轻量级的viewcontroller
54. 如何调试BAD_ACCESS错误
答:
a.重写object的respondsToSelector方法,现实出现EXEC_BAD_ACCESS前访问的最后一个object
b.通过Zombie

c.设置全局断点快速定位问题代码所在行
d. Xcode 7 已经集成了BAD_ACCESS捕获功能:Address Sanitizer。 用法如下:在配置中勾选✅Enable Address Sanitizer
55. lldb(gdb)常用的调试命令?
答:
- breakpoint 设置断点定位到某一个函数
- n 断点指针下一步
- po打印对象,p打印基本数据类型
拓展:
更多 lldb(gdb) 调试命令可查看