在OC中,內存管理采用"引用計數"的機制。這種機制的好處在于:如果有一個對象同時被多個指針指向時,這些指針都對這個對象擁有所有權。如果一個指針放棄所有權時不會將該內存銷毀,以避免出現野指針問題。
那么這種機制是如何實現的呢?這里需要幾個關鍵字:
1. retain 是引用計數+1
2. copy 復制一個原對象, 引用計數為 1, 原對象釋放
3. assign 直接賦值.
4. dealloc 當引用計數為0 時, 由系統調用, 回收空間
我們都知道,在定義一個類時,我們需要聲明屬性,系統會根據我們聲明的屬性自動生成setter和getter方法。但系統默認聲明的setter方法是直接賦值的(assign), 這樣我們在將對象賦值給成員變量時,就會出現上面所說的問題。為避免這種問題,方便地管理內存,我們需要在聲明屬性是加上關鍵字retain。這樣,我們再將對象賦值給成員變量時,會使其retaincount+1。
@interface Monitor : NSObject {//顯示器類 NSInteger _size;//尺寸 NSString *_type;//屏幕的類型 float _price;//價錢 } @property(nonatomic, retain) NSString *type; @end @implementation Monitor - (void)setType:(NSString *)type { if (_type != type) { [_type release]; _type = [type retain]; } } @end
比如,在type屬性聲明時加上 retain,它的setter方法如上。
如果聲明時加了retain屬性,釋放時dealloc方法需要重寫,代碼如下:
- (void)dealloc { [_type release]; [super dealloc]; }
管理內存是需要牢記黃金法則,凡是用alloc, retain, copy關鍵字時,都要對應使用release或autorelease。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。