Objective-C: ARC和Non-ARC混編的問題
阿新 • • 發佈:2019-01-09
假設有個framework是按照non-ARC編譯的,並且有個類方法建立並返回一個物件:
+(TestMe *)fetch {
TestMe *obj = [[[TestMe alloc] init] autorelease];
return obj;
}
而呼叫者是使用ARC編譯的:
TestMe *obj = [TestMe fetch];
[obj dosth];
如何釋放變數obj呢?
1. obj = nil; // 對於non-arc變數沒有用
2. [obj release]; // 編譯通不過,ARC下禁止呼叫release。當然有個小伎倆,
// 可以給TestMe定義一個方法,讓這個方法自己呼叫release,
// 因為TestMe本身是non-ARC裡面的,編譯器允許呼叫release方法
3. 使用作用域呢?
{
TestMe *obj = [TestMe fetch];
[obj dosth];
}
這個也不管用
這個時候可以使用autoreleasepool:
@autoreleasepool {
TestMe *obj = [TestMe fetch];
[obj dosth];
}
當出了這個@autoreleasepool作用域時,obj的dealloc方法被觸發,物件被銷燬。
總結:
你不能保證你的ARC應用程式不會呼叫非ARC的庫,因此在最外層設定@autoreleasepool是必須的
如果可能,在需要立刻銷燬非ARC變數的地方,再設定一層@autoreleasepool,可以節約記憶體的使用量
建立新的thread,這個thread的出入口最好也加上@autoreleasepool保護