讀書筆記:Objective-C高階程式設計 iOS與OS X多執行緒和記憶體管理 ——(持續)
- .自己生成的物件,自己所持有
- .非自己生成的物件,自己也能持有
- 不再需要自己持有的物件時釋放
- 非自己持有的物件無法釋放
eg:
/*
* 取得的物件存在,但是自己不持有
*/
id obj = [NSMutableArray array];
/*
* 自己持有物件
*/
[obj retain];
2.autrelease autorelease對待例項相當於c語言裡面的區域性變數,出了區域就被廢棄(如果對自動釋放池進行自動釋放,那麼會出現異常—>理由:無論呼叫哪一個物件的autorelease例項方法,實際上是呼叫NSObject類的autorelease例項方法,但是對於NSAutorelease類,autorelease例項方法已被該類過載,因此執行時會出錯)
- 生成並持有NSAutoreleasePool物件
- 呼叫已經分配物件的autorelease
- 廢棄NSAutoreleasePool物件
- 自己設定的釋放池的生命週期:,超出其作用域就會自動廢棄(某一段程式大量生成autorelease物件使用)
- 系統的釋放池:程式主迴圈的NSRunLoop或者其他程式可以執行的地方,對釋放池物件進行生成,持有和廢棄,(程式關閉)
id __strong obj0;
id __weak obj1;
id __autoreleasing obj2;
// 等同於下面程式碼
id __strong obj0 = nil;
id __weak obj1 = nil;
id __autoreleasing obj2 = nil;
// 1.__block不管是ARC還是MRC模式下都可以使用,可以修飾物件,還可以修飾基本資料型別。 2.__weak只能在ARC模式下使用,也只能修飾物件(NSString),不能修飾基本資料型別(int)。
3.__block物件可以在block中被重新賦值,__weak不可以。 PS:__unsafe_unretained修飾符可以被視為iOS SDK 4.3以前版本的__weak的替代品,不過不會被自動置空為nil。所以儘可能不要使用這個修飾符。