簡體   English   中英

從非ARC代碼調用ARC方法

[英]Calling ARC method from non-ARC code

我有一個使用ARC庫的非ARC項目。 我是否應該釋放由庫方法返回的對象感到困惑。 這是一些例子:

- (void)test{
    LibObject* obj1 = [[LibObject alloc] init];
    LibObject* obj2 = [obj1 otherObj];

    [obj1 release]; //should I release it?
    [obj2 release]; //should I release it?
}

據我所知,如果對象位於自動釋放池中,則應將其保留。 否則,我應該釋放它。

但是, ARC文檔

從此類函數或方法返回時,ARC會在返回語句的評估點保留該值,然后保留所有本地作用域,然后平衡保留,同時確保該值跨越調用邊界。 在最壞的情況下,這可能涉及自動釋放,但是調用者不得假定該值實際上在自動釋放池中。

該文檔是否暗示我由於不能假定對象已自動釋放而應始終釋放該對象?

請參閱“高級內存管理編程指南”中的內存管理策略

您擁有自己創建的任何對象
使用名稱以“ alloc”,“ new”,“ copy”或“ mutableCopy”開頭的方法(例如alloc,newObject或mutableCopy)創建對象。

您不得放棄您不擁有的對象的所有權

這些規則與使用ARC編譯的方法一致。 ARC文檔中 ,“ 3.2.2。保留的返回值”中描述了第一類方法的行為:

從此類函數或方法返回時,ARC會在返回語句的評估點保留值,...

這意味着調用者必須釋放該對象。

第二類中的方法在“ 3.2.3。未保留的返回值”中描述:

從此類函數或方法返回時,ARC會在返回語句的評估點保留值,然后保留所有本地范圍,然后平衡保留...

這意味着調用者不得釋放該對象。

因此,在您的示例中:

LibObject* obj1 = [[LibObject alloc] init];
LibObject* obj2 = [obj1 otherObj];
[obj1 release]; //should I release it? --> YES
[obj2 release]; //should I release it? --> NO

您擁有obj1 ,因為它是使用alloc創建的,因此必須釋放obj1

您沒有obj2 ,因此您不能釋放它。

注意:如果在代碼上運行Xcode靜態分析器,它將准確顯示違反這些規則的位置。

當將對象從啟用ARC的類轉移到未啟用ARC的類時,您有責任管理內存。

ARC只需在編譯時將保留,釋放到啟用ARC的代碼中即可 它不會管理處於非ARC模式的其他類或對象上的內存。

您需要后應釋放此類對象。

我的理解是,如果對此文件使用編譯器標志-fno-objc-arc ,則需要自己進行保留/釋放。 因此,您應該調用[obj1 release] 如果您不應該自己調用它,則編譯器會相應地警告您。

據我了解,在非ARC代碼中,您只需一如既往地對啟用了ARC的庫進行所有的保留/發布(就像與其他非ARC代碼進行交互一樣)。

我創建了一個簡單的應用程序來證明這種行為。

測試代碼- 無需 ARC即可編譯

- (void)testARC
{
    ARCLib *al = [[ARCLib alloc] init];
    NSLog(@"%p retainCount = %u", al, [al retainCount]);
    [al release];

    ARCLib *al2 = [ARCLib arcLib];
    NSLog(@"%p retainCount = %u", al2, [al2 retainCount]);
}

ARCLib- 使用 ARC編譯

@implementation ARCLib

+ (id)arcLib
{
    return [[self alloc] init];
}

- (id)init
{
    self = [super init];
    if (self)
    {
        NSLog(@"%p init",self);
    }
    return self;
}

- (void)dealloc
{
    NSLog(@"%p dealloc",self);
}

@end

結果

2012-12-13 20:15:21.879 ARCTest[15206:907] 0x1e821500 init
2012-12-13 20:15:21.883 ARCTest[15206:907] 0x1e821500 retainCount = 1
2012-12-13 20:15:21.884 ARCTest[15206:907] 0x1e821500 dealloc
2012-12-13 20:15:21.885 ARCTest[15206:907] 0x1dd26060 init
2012-12-13 20:15:21.886 ARCTest[15206:907] 0x1dd26060 retainCount = 1
2012-12-13 20:15:21.893 ARCTest[15206:907] 0x1dd26060 dealloc

回答你的問題

您應該釋放obj1,但不需要釋放obj2。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM