關(guān)聯(lián)文章
(一)并不很深入地探究 arc中 __strong 修飾符
(二)并不很深入地探究 arc中 __weak 修飾符
(三)并不很深入地探究 arc中 __autoreleassing 修飾符
ARC是由編譯器和運行時系統(tǒng)進(jìn)行內(nèi)存管理,本文將從編譯器和runtime系統(tǒng)出發(fā),探究 __autoreleassing 修飾符的實現(xiàn)過程妇多。
在此之前我們需要知道如何獲取匯編輸出(便于理解齐唆,下文匯編輸出將整理成偽代碼)
使用alloc/new/copy/mutableCopy 等自己生成并持有的情況
將對象賦值給帶有__autoreleasing修飾符的變量等同于ARC無效時調(diào)用autorelease方法赂蕴,例如:
@autoreleasepool {
id __autoreleasing obj = [[NSObject alloc] init];
}
匯編輸出:
id pool = objc_autoreleasePoolPush()
id obj = objc_msgSend(NSObject, @selector(alloc));
objc_msgSend(obj, @selector(init));
objc_autorelease(obj);
objc_autoreleasePoolPop(pool)
objc_autorelease
源碼
#if __OBJC2__
__attribute__((aligned(16)))
id
objc_autorelease(id obj)
{
if (!obj) return obj;
if (obj->isTaggedPointer()) return obj;
return obj->autorelease();
}
// OBJC2
#else
// not OBJC2
id objc_autorelease(id obj) { return [obj autorelease]; }
清晰明了objc_autorelease
球切,最終調(diào)用對象的autorelease
方法
使用alloc/new/copy/mutableCopy 等以外持有非自己生成對象情況
@autoreleasepool {
id __autoreleasing obj = [NSArray array];
}
匯編輸出:
id pool = objc_autoreleasePoolPush()
id obj = objc_msgSend(NSArray, @selector(array));
objc_retainAutoreleasedReturnValue(obj);
objc_autorelease(obj);
objc_autoreleasePoolPop(pool)
與前面源碼有何不同呢?只有多調(diào)用了一個方法objc_retainAutoreleasedReturnValue
, (另一篇文章 (一)并不很深入地探究 arc中 __strong 修飾符 已經(jīng)詳解過該方法源碼掸绞,此處不贅述 )簡而言之就是持有注冊到autoreleaspool中的對象 ,也就是將持有的方法從alloc
變?yōu)榱?code>objc_retainAutoreleasedReturnValue酷窥,其余仍然沒有改變咽安,仍然調(diào)用了objc_autorelease
函數(shù)