簡體   English   中英

Objective-C:從自身釋放 object

[英]Objective-C: releasing the object from itself

我偶然發現了一個有趣的情況,當 object 可以自行釋放時,我想知道在這種情況下什么被認為是安全和正確的。

假設我們有一個 class Foo:

@implementation Foo
+ (Foo *) foo {
    return [[[Foo alloc] init] autorelease];
}

- (void)resign {
    [FooHolder holder].foo = nil;

    // here's where the things happen
}
@end

另一個 class 是 FooHolder (具有一個屬性的單例):

@interface FooHolder : NSObject {
    Foo *foo;
}

@property (retain) Foo *foo;

+ (FooHolder *)holder;

@end

我們在代碼中的某個地方執行此操作(調用第一個stepOne ,然后調用stepTwo ;自動釋放池在stepOne完成后耗盡):

- (void)stepOne {
    Foo *foo = [Foo foo];

    [FooHolder holder].foo = foo;
}

- (void)stepTwo {
    [[FooHolder holder].foo resign]
}

如果我試圖在resign方法中訪問self ,在分配之后,使用 NSZombieEnabled,我會收到一個警告,提示self已經被釋放。 這給了我短暫的 WTF 時刻,但是好吧,我可以在這部分不訪問self的情況下生活。 更讓我煩惱的是,如果 object 已經被釋放了,誰能保證堆棧沒有損壞,並且我們正在正常處理我們的本地和實例變量? 一般來說,在方法中允許釋放self是一種不好的做法嗎?

一般來說,在方法中允許釋放 self 是一種不好的做法嗎?

是的,因為從 self 被釋放的角度來看,您的所有 ivars 也可以被釋放。

我不會假裝理解你的設計或你這樣做的原因,但你為什么不重新安排你的辭職方法:

- (void)resign {
    // here's where the things should happen
    [FooHolder holder].foo = nil;
}

在您有可能以與調用[super dealloc]; -(void)dealloc末尾

我會爭辯說你有一個錯誤的設計。 在實例方法-resign中,您實際上釋放了 singleton 持有的特定 foo 實例。 為什么 foo 的任意實例會這樣做? 在實例方法中引用有效的全局變量會使耦合過於緊密。

無論調用-resign應該是告訴[FooHolder holder]它已經辭去foo或將辭去 foo 的事情。 或者,在foo中對FooHolder進行弱引用,並讓foo向它發送類似-willResign:(Foo*)這樣的消息,這有效地使其成為foo的代表。 -willResign: FooHolder可以檢查它是否是正確的foo ,然后在將其設置為 nil 之前保留並自動釋放它。

暫無
暫無

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

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