內(nèi)存管理篇:7.ARC實(shí)現(xiàn)之__strong及autorelease優(yōu)化
對于持有非自己創(chuàng)建的對象的情況我注,我們知道,這種情況是指對于非“alloc迟隅、new但骨、copy和mutableCopy”開頭的并返回對象實(shí)例的方法,接收方不負(fù)責(zé)內(nèi)存管理智袭。
ARC會在方法實(shí)現(xiàn)中將返回值加入到autoreleasePool中奔缠,待接收方從中取出使用,延遲釋放時(shí)機(jī)补履。
但是實(shí)際上添坊,代碼并不會都如我們想象的那樣,因?yàn)闀懈鼉?yōu)化的執(zhí)行箫锤。先看代碼:
{
id __strong obj = [NSMutableArray array];
}
編譯后的模擬代碼為:
// 發(fā)消息創(chuàng)建對象
id obj = objc_msgSend(NSMutableArray, @selector(array));
// ???
objc_retainAutoreleasedReturnValue(obj);
// 正常釋放對象
objc_release(obj);
而對于NSMutableArray的array方法贬蛙,編譯后的模擬代碼為:
+ (id)array {
// 正常的二段式創(chuàng)建
id obj = objc_msgSend(NSMutableArray, @selector(alloc));
objc_msgSend(obj, @selector(init));
// ???
return objc_autoreleaseReturnValue(obj);
}
在以上代碼中可以看到,在這種情況下谚攒,ARC使用了objc_autoreleaseReturnValue替代了autorelease操作阳准,而調(diào)用方則使用objc_retainAutoreleasedReturnValue替代了傳統(tǒng)的retain操作。作用是什么呢馏臭?
AutoRelease優(yōu)化.jpg
使用這對方法(創(chuàng)建對象的方法返回使用objc_autoreleaseReturnValue返回的對象野蝇,而接收方使用objc_retainAutoreleasedReturnValue接收返回的對象)時(shí),編譯器實(shí)際上并沒有將生成的對象加入到autoreleasePool中括儒,而是直接將對象傳遞給接收方绕沈。避免了頻繁地將對象在autoreleasePool中進(jìn)行加入、取出操作帮寻,以達(dá)到最優(yōu)效率乍狐。