答案 0 :(得分:6)
self
将自己的保留计数减一,就像release
对任何其他对象一样。
{唯一的情况但是到目前为止,这样的调用是合适的,是 init…
方法的情况将失败,并期望返回nil并释放刚刚分配的实例。
在10种情况中,有9种你不应该使用[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]
适合的情况不是唯一。但仅仅是我到目前为止遇到的那些。 (正如 Oliver 正确指出的那样)
编辑:自我失效NSTimer
可能是另一种(非常常见,但有些特殊)的情况。
答案 1 :(得分:3)
你会释放自己,这意味着该对象声明它不必仍然存在。如果没有其他人保留对象,它就会死掉并释放其内存
您没有理由这样做,除了,如果您想创建不受其他人控制且自我控制的对象。
我的意思是,例如,有一种情况,你可能想要创建一个自我生活对象进行一些治疗,并在完成时自杀,而不必告诉其他人已完成。
让我们设想一个类,其目的只是向服务器发送消息:
你实现了这个类,一旦它被接收,它就会向服务器发送一条消息,等待服务器的回答,如果答案还可以,那就自杀了。这样,您就不必在另一个类管理器中管理任何服务器应答,而该类控制器的目的不是管理此类事件。
答案 2 :(得分:1)
它只是递减接收者的引用计数。