一翔烁、ARC
無需再次(禁止)鍵入retain或者是release代碼
1.__strong
(1) 以alloc/new/copy/mutableCopy/init 開頭的方法店枣,單純的插入release
{
id __strong obj = [[NSObject alloc] init];
}
相當于:
{
id obj = objc_msgSend(NSObject, @selector(alloc));
objc_msgSend(obj, @selector(init));
objc_release(obj);
}
(2) objc_autoreleaseReturnValue() 和 objc_retainAutoreleaseReturnValue()配合來提升效率,不被注冊到AutoreleasePool红竭。按常理講潦刃,id obj = [NSMutableArray array];
obj指向的對象應該注冊到AutoreleasePool中,但是ARC做了優(yōu)化右遭,前面兩個函數(shù)加在一起配合時做盅,就不會被注冊到AutoreleasePool,直接使用窘哈。
外部使用:
{
id __strong obj = [NSMutableArray array];
}
ARC下等同于:
{
id obj = objc_msgSend(NSMutableArray, @selector(array));
objc_retainAutoreleaseReturnValue(obj); // 在外面使用了retainAuto
objc_release(obj);
}
NSMutableArray內(nèi)部:
+ (id) array
{
return [[NSMutableArray alloc] init];
}
ARC下等同于:
+ (id) array
{
id obj = objc_msgSend(NSMutableArray, @selector(alloc));
objc_msgSend(obj, @selector(init));
return objc_autoreleaseReturnValue(obj); // 內(nèi)部使用auto
}
2.__weak
附有__weak修飾符的變量必定會訪問AutoreleasePool中的對象:
(1)引用:因為__weak只持有對象的弱引用吹榴,而在訪問引用對象的過程中,該對象有可能被廢棄滚婉。如果把要訪問的對象注冊到AutoreleasePool中图筹,那么在@autoreleasepool塊結(jié)束之前都能確保該對象存在。
(2)理解:__weak wkObj = obj;
只有當wkObj被使用的時候满哪,obj才會被注冊到AutoreleasePool中婿斥,引用計數(shù)也會增加劝篷。
3.__autoreleasing
將對象賦值給附有__autoreleasing修飾符的變量,等同于MRC下調(diào)用對象的autorelease方法民宿。ARC借助AutoreleasePool的能力來處理娇妓。
二、Autorelease:
自動變量的作用域活鹰,超出作用域后自動調(diào)用release哈恰。
調(diào)用autorelease方法的變量會在 AutoreleasePool 作用域結(jié)束時被自動調(diào)用release
AutoreleasePool 會持有對象
自己生成并持有的對象(自己:對象的使用環(huán)境/編程人員自己):alloc/new/copy/mutableCopy 或以此開頭
“非自己生成并持有”的對象,即不是以 alloc/new/copy/mutableCopy 開頭的方法獲得的對象志群,對象會被注冊到AutoreleasePool中
init方法返回的對象着绷,不會被注冊到AutoreleasePool中
不使用 __autoreleasing 修飾符時,如果對象是函數(shù)返回值锌云,那么對象也會被編譯器注冊AutoreleasePool中
id *obj
==id __autoreleasing *obj;
NSError **obj
==NSError * __autoreleasing *obj;
OC中的自動變量
- 局部變量
- 函數(shù)
- 方法參數(shù)