[英]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.