繼續學習記憶體管理相關知識。
1、小小知識點
1>有關oc記憶體管理的方法並不包括在該語言中,而是包含在cocoa框架中,用於os x,ios的開發。
2>cocoa框架中foundation框架類庫中的nsobject類負責記憶體管理的職責。
4>使用以下方法自己生成的物件,自己持有
+alloc
+new
+copy
+mutablecopy
例如:
nsobject * obj =[ [nsobject alloc]init];
使用alloc方法生成物件,並把指向該物件的指標賦值給了obj這個變數,現在這個物件的retaincount值等於1。
另外,使用new方法生成物件基本等同於[ [nsobject alloc]init]。
即:[nsobject new] --------- [[nsobject alloc]init];
題外話:[nsobject new]和 [[nsobject alloc]init]到底有什麼區別呢?
我一直不相信他們沒有任何區別,如果真是沒有任何區別又為什麼要寫兩個方法呢?
new方法的原始碼:
+new
而 alloc/init 像這樣
+alloc
-init
概括來說,new和alloc/init在功能上幾乎是一致的,分配記憶體並完成初始化。
差別在於,採用new的方式只能採用預設的init方法完成初始化,採用alloc的方式可以用其他定製的初始化方法。
5>非自己生成的物件,自己也能持有
id obj = [nsarray array];
obj可以取得物件的存在,但是並不持有該物件。
如果想持有該物件,需要主動呼叫retain方法,即:
[obj retain];
這樣obj就持有了該物件。
6>自己持有的物件,如果不在需要了,就需要釋放該物件,釋放物件使用release方法。
//生成並持有該物件
id obj = [[nsobject alloc]init];
//釋放該物件
[obj release];
//非自己生成物件
id obj = [nsarray array];
//持有物件
[obj retain];
//釋放物件
[obj release];
注意:已經釋放的物件是不可以再次訪問的,如果訪問了已經被釋放的物件,就會造成崩潰。(wow,好可怕,但是一定遇見過)。 記憶體管理學習筆記
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.基類都使用虛析構函式,這樣才能...