今天在網上查找有關程序奔潰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