可能重複:如果我用這個代碼片斷
Is calling [self release] allowed to control object lifetime?Objective-C中的[self release]是什麼意思?
會發生什麼?
[self release]
可能重複:如果我用這個代碼片斷
Is calling [self release] allowed to control object lifetime?Objective-C中的[self release]是什麼意思?
會發生什麼?
[self release]
self
descrements自己的一個保留計數,就像release
將與任何其他對象做。
的唯一情況但我迄今遇到,其中這樣的稱呼是恰當的,當時的情況下的init…
方法將失敗,並有望回到零和釋放剛剛分配的實例 。
中有9個10分的情況下,你不應該使用[self release]
,我估計。
像這樣的東西(這基本上是禁止的- (id)init;
調用,爲要強制使用特定- (id)initWith…
方法的情況下):
- (id)init {
[self release];
NSString *reason = [NSString stringWithFormat:@"%@ is not a valid initializer for the class %@", NSStringFromSelector(_cmd), NSStringFromClass([self class])];
@throw [NSException exceptionWithName:NSInternalInconsistencyException
reason:reason
userInfo:nil];
return nil;
}
或本(這基本上是強制的的證明在初始化對象)
- (id)initWithFoo:(Foo *)foo {
if (!foo) {//foo is required to be non-nil!
[self release];
return nil;
}
//proceed with initialization
return self;
}
然而這些都不是唯一的有史以來場合[self release]
將是適當的。但僅僅是我迄今爲止遇到的那些。 (如奧利弗正確地指出)
編輯:自無效NSTimer
小號可能會是另一個(很常見,但有些特殊)的情況。
它只是遞減接收器的引用計數。
你會釋放自己,什麼意味着對象本身宣稱,它沒有來還住。如果沒人保留塔對象,它死了,它的內存被釋放
你沒有什麼理由這樣做,除了,如果你想創建一個不受任何人控制的對象,並且是自我控制。
我的意思是,例如,存在這樣的情況,你可能要當它不必告訴別人,它已經完成完成創建一個自住對象,使一些治療和自殺的情況。
讓我們想象一下,例如一類,其目的只是將消息發送到服務器:
您實例化的類,只要它是istanciated這將消息發送到一臺服務器,它等待服務器回答,如果答案沒問題,那就自殺了。這樣,您不必管理其他類控制器中的任何服務器應答,其目的不是管理這些事件。
還有很多其他情況,您可能想要這樣做。看到我的答案。 – Oliver