黑馬程式設計師 OC autorelease

2021-07-04 10:36:18 字數 1589 閱讀 6521

autorelease

當乙個物件呼叫autorelease時,會將這個物件放到位於棧定的釋放池中。是一種支援引用計數器的記憶體管理方式,在執行[物件名 autorelease]時會將物件放到位於棧頂的釋放池,等到結束時,對每個物件傳送release訊息。注意,這裡只是傳送release訊息,如果引用計數器依然不為0,則改物件不會釋放。

自動釋放池的建立:

autoreleasepool{//自動釋放池的開始

.....

}//自動釋放池的結束

autorelease

的基本用法

(1)會將物件放到乙個自動釋放池中

(2)當自動釋放池被銷毀時,會對池子裡的所有物件做一次release

(3)會返回物件本身

(4)呼叫完autorelease方法後,物件的計數器不受影響(銷毀時影響) 

在autorelease的模式下,下述方法是合理的,即可以正確返回結果,也不會造成記憶體洩露 

classa *func1()

autorelease

注意及錯誤用法

1)並不是放到自動釋放池中,都會自動加入到自動釋放池

int main(int argc, const

char *argv) 2

)在自動釋放池的外部傳送

autorelease

不會被加入到自動釋放池中

int main(int argc, const

char *argv)

person *p = [person new];

[pautorelease]//因為是物件在自動釋放池外部呼叫autorelease,該物件病沒有加入到自動釋放池中

return0;

} 3

)不管這個物件是在自動釋放池內還是外建立的,只要在自動釋放池內寫乙個[p1autorelease];p1就會被放到自動釋放池中。注意autorelease是乙個方法,且只有在自動釋放池中使用才有效。

如:int main(int argc, const

char *argv)

return0;

} 4)自動釋放池的巢狀使用

int main(int argc, const

char *argv)

[p autorelease];//

在此將p

加到另乙個自動釋放池中}

return0;

} 5)自動釋放池中不適宜放占用記憶體比較大的物件

盡量避免對大記憶體使用該方法,對於這種延遲釋放機制,還是盡量少用不要把大量迴圈操作放到同乙個 @autoreleasepool 之間,這樣會造成記憶體峰值的上公升 

autorelease

錯誤用法

(1)連續呼叫多次autorelease

(2)alloc之後呼叫了autorelease,之後又呼叫了release。  如:

int main(int argc, const

char *argv) //自動釋放池結束後會p回釋放,

[p release ]//

此處的p

是殭屍物件,在使用會出錯

return0;

}

黑馬程式設計師

asp.net android ios開發 net培訓 期待與您交流!map hashtable 底層是雜湊表資料結構,不可以存入null鍵和null值。該執行緒是同步的,jdk1.0出現,效率低。hashmap 底層是雜湊表資料結構,允許使用null鍵和null值。該集合執行緒是不同步的,將has...

黑馬程式設計師

1.了解反射 反射 就是通過class檔案物件,去使用該檔案中的成員變數,構造方法,成員方法。person p new person p.使用 要想這樣使用,首先你必須得到class檔案物件,其實也就是得到class類的物件。2.反射中的類 class類 成員變數 field類 構造方法 const...

黑馬程式設計師

黑馬程式設計師 j a基礎學習筆記2 一 筆記內容概述 關鍵字 識別符號 注釋 注釋的應用 常量 進製的由來 進製轉換 負數的進製 變數的介紹 變數的基本演示 型別提公升 強制轉換 字元型別運算過程 型別運算細節 算術運算子 賦值運算子。二 常用內容介紹 1.注釋內容不占用記憶體,即使新增再多的注釋...