2011-11-17 50 views

回答

6

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小號可能會是另一個(很常見,但有些特殊)的情況。

+0

還有很多其他情況,您可能想要這樣做。看到我的答案。 – Oliver

1

它只是遞減接收器的引用計數。

3

你會釋放自己,什麼意味着對象本身宣稱,它沒有來還住。如果沒人保留塔對象,它死了,它的內存被釋放

你沒有什麼理由這樣做除了,如果你想創建一個不受任何人控制的對象,並且是自我控制。
我的意思是,例如,存在這樣的情況,你可能要當它不必告訴別人,它已經完成完成創建一個自住對象,使一些治療和自殺的情況。

讓我們想象一下,例如一類,其目的只是將消息發送到服務器:

您實例化的類,只要它是istanciated這將消息發送到一臺服務器,它等待服務器回答,如果答案沒問題,那就自殺了。這樣,您不必管理其他類控制器中的任何服務器應答,其目的不是管理這些事件。