今天在网上查找有关程序奔溃terminate_handler unexpectedly threw an exception的问题时偶然看到一篇文章为什么不要在init和dealloc函数中使用accessor仔细看了下,这个问题确实是日常写代码过程中很容易忽略的细节,又长知识了。这种问题,之前在写代码中也遇到过这种问题,后来解决了,但是没有深究其原因,惭愧,惭愧。
这里Advanced Memory Management Programming Guide苹果给出了推荐做法,但是没有给出原因。
看了为什么不要在init和dealloc函数中使用accessor中的例子,感觉不是很理解,照着作者的代码敲了一遍,果然跑起来报错,断点看了下程序执行步骤,还是想不通代码的调用顺序。归根结底还是自己对OC的runtime理解不够,程序的执行步骤是runtime的杰作。于是又搜得一篇文章Objective-C Runtime 运行时之六:拾遗看了其中对super的解释后再返回看上一篇文章作者的例子,就可以理解了。
在这篇文章刨根问底Objective-C Runtime(1)- Self & Super中给出了self和super的解释:
**
self 是类的隐藏参数,指向当前调用方法的这个类的实例。而 super 是一个 Magic Keyword, 它本质是一个编译器标示符,和 self 是指向的同一个消息接受者。上面的例子不管调用[self class]还是[super class],接受消息的对象都是当前 Son *xxx 这个对象。而不同的是,super是告诉编译器,调用 class 这个方法时,要去父类的方法,而不是本类里的。
当使用 self 调用方法时,会从当前类的方法列表中开始找,如果没有,就从父类中再找;而当使用 super 时,则从父类的方法列表中开始找。然后调用父类的这个方法。
**
参考
为什么不要在init和dealloc函数中使用accessor
网友评论