1. 程式人生 > >Objective-C: ARC和Non-ARC混編的問題

Objective-C: ARC和Non-ARC混編的問題

假設有個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保護