△簡述基本原則
1.之前:oc記憶體管理遵循"誰建立、誰釋放,誰引用、誰管理"的機制,當建立或引用乙個物件的時候,需要向其傳送alloc、copy、retain訊息,當釋放該物件是需要傳送release訊息,當物件引用計數為0時,系統將釋放該物件,這是oc的手動管理機制(mrc)。
2.目前:ios5.0之後引用自動管理機制---自動引用計數(arc),管理機制與手動機制一樣,只是不再需要呼叫retain、release、autorelease;他編譯時的特性,當你使用arc時,在適當位置插入release和autorease;他引用strong和weak關鍵字,strong修飾的指標變數指向物件時,當指標指向新值或指標不復存在,相關聯的物件就會自動釋放,而weak修飾的指標變數指向物件,當物件的擁有者指向新值或者不存在時weak修飾的指標會自動置為nil。
3.如果使用alloc、copy或者retain乙個物件時,你就有義務,向它傳送一條release或者
autorelease訊息。其他方法建立的物件,不需要由你來管理記憶體。
4.向乙個物件傳送一條autorelease訊息,這個物件並不會立即銷毀,而是將這個物件放入了自動釋放池,它會向池中每乙個物件傳送一條release訊息,以此來釋放物件。
5.向乙個物件傳送release訊息,並不意味著這個物件唄銷毀了,而是當這個物件的引用計數為0時,系統才會呼叫dealloc方法,釋放該物件和物件本身他所擁有的例項。
△其他注意事項
1.如果乙個物件有乙個_strong型別的指標指向著,這個物件就不會被釋放。如果乙個指標指向超出了它的作用域,就會被指向nil。如果乙個指標被指向nil,那麼它原來指向的物件就被釋放了。當乙個試圖控制器被釋放時,它內部的全域性指標會被指向nil。用法:不管全域性變數還是區域性變數用strong描述就行。
區域性變數:出了作用域,指標會被置為nil。
方法內部建立物件,外部使用需要新增autorelease;
連線的時候,用weak描述
**使用unsafe_unretained就相當於assign
block中為了避免迴圈引用問題,使用_weak描述;
宣告屬性是,不要以new開頭。如果非要以new開頭命名屬性的名字,需要自己定製get方法名,如
@property(getter = thestring) nsstring * newstring;
如果要使用自動釋放池,用@autoreleasepool{}
arc只能管理foundation框架的變數,如果程式中把foundation中的變數強制換成corefoundation中的變數需要交換管理權
在非arc工程中採用arc去編譯默寫類:-fobjc-arc。在arc下的工程採用非arc去編譯某些類:-fno-fobjc-arc。
MRC ARC 記憶體洩露 記憶體管理
什麼是記憶體管理?換句話就是對記憶體位址的操作。程式在執行的過程中通常以下行為,都會使程式占用記憶體。1.建立乙個oc物件 2.定義乙個變數 3.呼叫乙個函式或者方法 通常我們買手機都要關注下,手機的記憶體 執行記憶體等引數,那是因為我們手機的記憶體是一定的,超出手機記憶體,會導致手機崩潰,宕機等狀...
MRC ARC記憶體管理機制
mrc下,oc記憶體管理遵循 誰建立 誰釋放 誰引用 誰管理 的機制,當建立或引用乙個物件時,需要向她傳送alloc,copy,retain訊息,當釋放該物件時需要傳送release訊息,當引用計數為零的時候,系統釋放該物件。arc是自動引用計數,管理機制與手動機制一樣,只是不再需要呼叫retain...
linux記憶體雜記
1.linux 優先運用物理記憶體,當物理記憶體還有空閒時,linux是不會施放記憶體 的,即使占用記憶體的程式已經被關閉了 這部分記憶體就用來做快取了 也就 是說,即時你有2g的記憶體,用過一段時間後,也會被佔滿。這樣做的裨益是,啟 動那些剛開啟過的程式 或是讀取剛訪問過得資料會比較快,對於伺服器...