iOS 5.0之前:
OC內存管理遵循“誰創建,誰釋放,誰引用,誰管理”的機制
當創建或引用一個對象的時候,需要向她發送alloc、copy、retain消息
當釋放該對象時需要發送release消息,
當對象引用計數為0時,系統將釋放該對象,
這是OC的手動管理機制(MRC)。
全稱 Manual Reference Counting, 是需要開發者手動標記對象以決定其在內存中的命運的運行機制。
iOS 5.0之后:
引用自動管理機制——自動引用計數(ARC)。全稱Automatic Reference Counting
管理機制與手動機制一樣,只是不再需要調用retain、release、autorelease;
它編譯時的特性,當你使用ARC時,在適當位置插入release和autorelease;
它引用strong和weak關鍵字
strong修飾的指針變量指向對象時,當指針指向新值或者指針不復存在,相關聯的對象就會自動釋放
weak修飾的指針變量指向對象,當對象的擁有者指向新值或者不存在時,weak修飾的指針會自動置為nil
如果使用alloc、copy(mutableCopy)或者retian一個對象時,你就有義務,向它發送一條release或者autorelease消息。其他方法創建的對象,不需要由你來管理內存。
向一個對象發送一條autorelease消息,這個對象并不會立即銷毀, 而是將這個對象放入了自動釋放池,
待池子釋放時,它會向池中每一個對象發送 一條release消息,以此來釋放對象.
向一個對象發送release消息,并不意味著這個對象被銷毀了,而是當這個對象的引用計數為0時,系統才會調用dealloc方法,釋放該對象和對象本身它所擁有的實例。
其他注意事項
如果一個對象有一個_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中的變量強制換成Core Foundation中的變量需要交換管理權;
在非ARC工程中采用ARC去編譯某些類:-fobjc-arc。
在ARC下的工程采用非ARC去編譯某些類:-fno-fobjc-arc。
修改時間:
2016年11月17日09:38:57