記憶體管理學習筆記1

2022-08-03 18:06:10 字數 1110 閱讀 8881

背景:乙個人想要遛狗,中途可以換別的狗遛

所以首先得有乙個狗的類 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.基類都使用虛析構函式,這樣才能...