搜尋

首頁  >  問答  >  主體

ios - 关于objective-c内存管理的一个疑问?

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

PHPzPHPz2842 天前701

全部回覆(4)我來回復

  • 天蓬老师

    天蓬老师2017-04-17 11:58:14

    首先,在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了那麼一兩下。

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-17 11:58:14

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

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

    回覆
    0
  • 怪我咯

    怪我咯2017-04-17 11:58:14

    在arc中的release是沒有用的。

    回覆
    0
  • 迷茫

    迷茫2017-04-17 11:58:14

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

    回覆
    0
  • 取消回覆