背景:乙個人想要遛狗,中途可以換別的狗遛
所以首先得有乙個狗的類 dog;然後乙個 person類 裡有乙個dog的變數,自己過載setdog函式
@synthsize dog= _dog;
-(void) setdog:(dog *)adog
if(_dog ! = adog) //先判斷要設定的狗是不是原來的狗,避免誤設定同一條狗,第一次設定時,_dog應該是nil,和要設定的不相等
[_dog release]; //將原來的狗釋放掉
_dog = [adog retain];//設定新的狗
然後在dealloc 函式中有句
-(void)dealloc
[_dog release];
[super release];
我開始看他這樣寫的時候就想,如果沒有呼叫這個 setter 設定函式,那在dealloc函式中取釋放乙個不存在的物件不會報錯嗎.
後來講師說 再c++中會報斷言錯誤,但在ios中沒問題,可以這樣釋放。
@property(retain) dog;
加乙個(retain) 關鍵字後,這樣乙個宣告,程式會在@sythnsize dog = _dog;的時候 自動展成上述形式
-(void) setdog:(dog *)adog
if(_dog ! = adog) //先判斷要設定的狗是不是原來的狗,避免誤設定同一條狗,第一次設定時,_dog應該是nil,和要設定的不相等
[_dog release]; //將原來的狗釋放掉
_dog = [adog retain];//設定新的狗
-(dog *)dog
return _dog;
看delloac 函式
-(void) dealloc
self.dog = nil;// 這條語句 其實會呼叫 setter函式 相當於[self.dog setdog:nil];將nil 當做引數傳進去。nil與之前值不等,之前值被釋放。
[super dealloc];
// 以後凡是 在屬性宣告中 用到了 (retain)關鍵字,就可以再 dealloc中 用 點語法 把nil 傳進去。在 setter 函式中就會做release 操作。
記憶體管理學習筆記
1.棧 堆和靜態區 靜態區 儲存自動全域性變數和static變數 包括全域性靜態變數和區域性靜態變數 靜態區的內容在整個程式的生命週期內都存在。棧 儲存區域性變數。棧上的內容只在函式的範圍內存在,當函式執行結束,這些內容也會自動被銷毀。其特點是效率高,但是空間大小有限。堆 由malloc系列函式或n...
object c 記憶體管理學習筆記
nsautoreleasepool pool nsautoreleasepool alloc init pool drain 這個函式可以把autoreleasepool裡的物件釋放 在for迴圈中每次都釋放記憶體池的示例 nsautoreleasepool temppool for i 0 i a...
effectiveC 記憶體管理 學習筆記
1.盡量使用初始化列表而不要再建構函式裡賦值,初始化順序和宣告的順序一致,一些型別如const,引用等,必須使用初始化。對於非內部資料型別成員物件應當採用初始化表,以獲取更高的效率。example b b const a a m a a 只呼叫了類a的拷貝建構函式 2.基類都使用虛析構函式,這樣才能...