關於OC記憶體管理 03

2021-07-03 16:22:20 字數 915 閱讀 4787

1.對於上篇文章,物件的例項變數(oc物件型別)的setter方法,只是執行一次retain操作,則這個程式是有缺陷的。可以想到的是,如果我們不小心在main.m裡多執行了一次

p.book = b,則我們又執行了一次retain操作,此時計數器又加上了1,不符合記憶體管理原則。但是如何修改呢。 我們可以在執行retain操作做乙個判斷,如果傳進來的物件引數和例項變數不相等 則進行retain操作。修改**如下:

-(void)setbook:(book *)book

}

2.雖然執行多次p.book = b 的問題得以解決,但是我們發現這個方法並不完善。如果我們突然不想要這本書,而想要另一本書了呢?即在main.m裡p.book = b 下面再建立乙個書物件b2即 book *b2 = [[book alloc] init]; p.book = b2;

[b2 release];

這時候顯然b2物件計數器已經為2,程式執行完後。b2和p物件都已經被**。而b並沒有被**,因為當執行p.book = b2操作時並沒有讓b物件計數器減1,既然已經不用書物件了,我們就應該讓b物件減1,所以改善後的**:

-(void)setbook:(book *)book

}

總結:

set方法的記憶體管理:

1.先判斷傳進來的是否為新的物件

2.在對舊值(原先例項變數儲存的值)進行release操作

3.再對新值(新傳進來的物件)進行一次retain操作

值得注意的是:一定要在dealloc方法裡對占用的物件進行一次release操作。並且寫此方法時,一定要寫

[super dealloc]並把其放在最後。

03 OC記憶體管理原則

1 原則分析 1 只要物件還在被使用,系統就不會 物件占用的記憶體。2 當你使用物件的時候,就呼叫 retain 方法,使物件的計數器 1。3 當你不再使用物件的時候,就呼叫 release 方法,使物件的計數器 1。2 記憶體管理原則 1 誰建立,誰release 1 如果你通過 alloc ne...

Oc 記憶體管理

1 對你自己擁有的物件負責,你只能釋放你擁有的物件 2 凡是你通過 retain alloc copy等手段獲得了所有者的物件,都必須在你不使用的時候來呼叫release autorelease等手段來釋放對他的所有權 3 在一定的 段內,對同乙個物件所作的copy alloc retain的操作次...

OC記憶體管理

1.記憶體管理原則 如果對乙個物件使用了alloc mutable copy retain,那麼你必須使用相應的release或者autorelease。2.管理範圍 任何繼承了nsobject 的物件,對其他基本資料型別 int char float double struct enum等 無效 ...