如图示:不是说release调用之后对象内存就被释放了么?那为什么jack对象还能调用say方法[jack say]?
学习是最好的投资!
首先,在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了那麼一兩下。
say沒有訪問self,cpp也有類似的內容
我去搜了下,我的回答是錯誤的必須要更正下: 能夠正確列印,關鍵在於物件的記憶體還沒有抹掉。 objective-c的呼叫機制跟cpp不一樣,我說cpp有類似的內容可能會誤導你。 objC的訊息發生[obj call],都會呼叫objc_msgSend,具體查看:深入分析objc_msgSend
在arc中的release是沒有用的。
ARC中retainCount變成0時,它會通知系統這個物件要被回收了,發送訊息和處理訊息是個非同步的過程,它需要時間
然後說這個問題,在Objective-C中程式碼直接控制的並不是記憶體本身,而是記憶體中這個實例的參考計數。
所以,alloc方法初始化jack後,jack的引用計數是1。呼叫了release方法,只是把jack這個實例的引用計數減1,變成0。
引用計數為0並不等於實例被銷毀,而是標記為「該實例可以被銷毀」。
如果你的程式碼這樣寫
就會發現jack只say了前邊一兩次,然後就say不出來了。
因為系統回收發現jack可以被回收,並回收這段記憶體是需要一點點時間的,而在這段時間內jack就say了那麼一兩下。
我去搜了下,我的回答是錯誤的必須要更正下:
能夠正確列印,關鍵在於物件的記憶體還沒有抹掉。
objective-c的呼叫機制跟cpp不一樣,我說cpp有類似的內容可能會誤導你。
objC的訊息發生[obj call],都會呼叫objc_msgSend,具體查看:深入分析objc_msgSend
在arc中的release是沒有用的。
ARC中retainCount變成0時,它會通知系統這個物件要被回收了,發送訊息和處理訊息是個非同步的過程,它需要時間