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等 無效 ...