ios - 关于objective-c内存管理的一个疑问?
PHPz
PHPz 2017-04-17 11:56:14
0
4
653

如图示:不是说release调用之后对象内存就被释放了么?那为什么jack对象还能调用say方法[jack say]?

PHPz
PHPz

学习是最好的投资!

全部回覆(4)
Peter_Zhu

首先,在ARC時代不建議大家還手動管理引用計數

然後說這個問題,在Objective-C中程式碼直接控制的並不是記憶體本身,而是記憶體中這個實例的參考計數。
所以,alloc方法初始化jack後,jack的引用計數是1。呼叫了release方法,只是把jack這個實例的引用計數減1,變成0。
引用計數為0並不等於實例被銷毀,而是標記為「該實例可以被銷毀」。
如果你的程式碼這樣寫

Person *jack = [[Person alloc] init];
[jack release];
[jack say];
[jack say];
[jack say];
[jack say];
[jack say];
[jack say];
[jack say];

就會發現jack只say了前邊一兩次,然後就say不出來了。
因為系統回收發現jack可以被回收,並回收這段記憶體是需要一點點時間的,而在這段時間內jack就say了那麼一兩下。

Peter_Zhu

say沒有訪問self,cpp也有類似的內容

我去搜了下,我的回答是錯誤的必須要更正下:
能夠正確列印,關鍵在於物件的記憶體還沒有抹掉。
objective-c的呼叫機制跟cpp不一樣,我說cpp有類似的內容可能會誤導你。
objC的訊息發生[obj call],都會呼叫objc_msgSend,具體查看:深入分析objc_msgSend

刘奇

在arc中的release是沒有用的。

迷茫

ARC中retainCount變成0時,它會通知系統這個物件要被回收了,發送訊息和處理訊息是個非同步的過程,它需要時間

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板