書中說的太繞,就是說如果某對象正在被使用,你要保證它在被使用期間不能被銷毀。
同一個指針,指向了另一個對象,就必須放棄原來指向的對象的所有權。
這作者真是白癡,總寫一些自認為正規的文字,其實一點都不明白,寫書是要人明白的呀?。。?/p>
在默認情況下聲明屬性是原子性的,即atomic。
從書中所描述的內容來看應該是MRC時代的理論了,不過也值得一記。
實現存取器的3種途徑:
1、在getter內部先retain再autorelease,因為getter是要把本身屬性所使用的那個對象也提供給人,這是一種共享的行為,又由于這是MRC的產物,所以在給使用者之前就把引用計數+1,然后再加個autorelease就能延遲釋放,想得很周到,但是autorelease在getter被頻繁使用的時候性能開銷很大不劃算。在setter釋放舊值保留新值。
2、getter正常返回值,但是在setter中自動釋放舊值保留新值。setter中所做的工作其實是把屬性的指針原來所指向的值釋放掉,然后再指向傳進setter的那個值。
3、getter正常返回值,但是在setter中手動釋放舊值保留新值。它能夠精準控制對象的生存期,適合于頻繁使用存取器的場景,不過由于對象會被馬上釋放,所以搞不好就會出現訪問nil的情況導致崩潰。
這個作者寫書真是浪費時間,他舉了個計數器對象的例子,但卻沒有明確說明它和引用計數完全不同,作者說的計數器并不是引用計數,就是一個用來計數的對象。
作者說的話我不是太懂這里所講的有什么不同。
難道不是說傳進setter的值如果不被retain就不能獲取傳進來的值的所有權嗎?不獲取所有權就可能被無意中釋放掉?如果是這個意思,那就已經說了千八百遍了,不用再舉個例子,我還以為說的是別的意思呢。
不能在init和dealloc中不能使用accessor
不能調用accessor,于是你只能自定義一個初始化方法了。作者給出的實現是copy了那個傳進來的實參,然后去給屬性賦值。最后在dealloc的時候去release這個屬性。
如何實現reset方法
在MRC時代簡便的構造函數是不需要你去retain、release的它自動完成。
什么樣的是簡便構造函數呢?
就這樣——
[NSNumber numberWithInteger:0]
再有就是用alloc來初始化它,哦,這樣的不是簡便構造函數。
[[NSNumber alloc] numberWithInteger:0]
這種情況下你就必須release了,因為alloc的時候構造的對象的引用計數就已經是1了,這個時候再被指針一指,引用計數就變成了2,如果不release一次,引用計數就平白無故地多了1,就會造成內存泄露。
當然這里說的步驟是:
- alloc。
- 賦值。
- release。
然而這只是個特定的例子,還是計數對象的那個例子,作者是想借將計數對象置0來說明重置應該如何實現。
不使用setter而直接使用=來賦值,就需要在別的地方來控制引用計數,一不小心就容易造成錯誤,這是作者不建議使用的。
利用簡便構造函數構造的對象是不需要你去手動release的,如果你再去release非??赡軙蛞粋€已經是nil的對象發送消息從而引發崩潰。