Objective-C中的[self release]是什么意思?

时间:2011-11-17 12:53:05

标签: objective-c ios release

  

可能重复:
  Is calling [self release] allowed to control object lifetime?

如果我使用此代码段会发生什么?

[self release]

3 个答案:

答案 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)

它只是递减接收者的引用计数。