【靠谱程序员#6】《招聘一个靠谱的程序员》个人解答(end)

288 阅读2分钟

系列:

【靠谱程序员#0】《招聘一个靠谱的程序员》个人解答

【靠谱程序员#1】《招聘一个靠谱的程序员》个人解答

【靠谱程序员#2】《招聘一个靠谱的程序员》个人解答

【靠谱程序员#3】《招聘一个靠谱的程序员》个人解答

【靠谱程序员#4】《招聘一个靠谱的程序员》个人解答

【靠谱程序员#5】《招聘一个靠谱的程序员》个人解答

【靠谱程序员#6】《招聘一个靠谱的程序员》个人解答(end)

51. apple用什么方式实现对一个对象的KVO?

答:

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

KVO实现流程

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

通过Zombie

c.设置全局断点快速定位问题代码所在行

d. Xcode 7 已经集成了BAD_ACCESS捕获功能:Address Sanitizer。 用法如下:在配置中勾选✅Enable Address Sanitizer

55. lldb(gdb)常用的调试命令?

答:

  • breakpoint 设置断点定位到某一个函数
  • n 断点指针下一步
  • po打印对象,p打印基本数据类型

拓展:

更多 lldb(gdb) 调试命令可查看

The LLDB Debugger

苹果官方文档: iOS Debugging Magic

End