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.注釋內容不占用記憶體,即使新增再多的注釋...