Objective-C中的[自我释放]是什么意思?

Objective-C中的[自我释放]是什么意思?,objective-c,ios,release,Objective C,Ios,Release,可能重复: 如果我使用这个代码段会发生什么 [self release] self将其自身的保留计数减少一,就像release对任何其他对象所做的一样 然而,到目前为止,我遇到的唯一情况是,这样一个调用是合适的,即init…方法将失败,并期望返回nil并取消分配刚刚分配的实例 我估计,10种情况中有9种不应该使用[自我释放] 类似这样的情况(基本上禁止调用-(id)init;,如果您想强制使用特定的-(id)initWith…方法): 或者这样(基本上强制在初始化时证明对象) 然而,这并不是

可能重复:

如果我使用这个代码段会发生什么

[self release]

self
将其自身的保留计数减少一,就像
release
对任何其他对象所做的一样

然而,到目前为止,我遇到的唯一情况是,这样一个调用是合适的,即
init…
方法将失败,并期望返回nil并取消分配刚刚分配的实例

我估计,10种情况中有9种不应该使用
[自我释放]

类似这样的情况(基本上禁止调用
-(id)init;
,如果您想强制使用特定的
-(id)initWith…
方法):

或者这样(基本上强制在初始化时证明对象)

然而,这并不是只有在
[自我释放]
合适的情况下才出现的。但仅仅是我到目前为止遇到的那些。(正如奥利弗正确指出的那样)


编辑:自失效的
NSTimer
s可能是另一种(非常常见,但有些特殊)情况。

Self
将其自身的保留计数减少一,就像
释放
处理任何其他对象一样

然而,到目前为止,我遇到的唯一情况是,这样一个调用是合适的,即
init…
方法将失败,并期望返回nil并取消分配刚刚分配的实例

我估计,10种情况中有9种不应该使用
[自我释放]

类似这样的情况(基本上禁止调用
-(id)init;
,如果您想强制使用特定的
-(id)initWith…
方法):

或者这样(基本上强制在初始化时证明对象)

然而,这并不是只有在
[自我释放]
合适的情况下才出现的。但仅仅是我到目前为止遇到的那些。(正如奥利弗正确指出的那样)


编辑:自失效
NSTimer
s可能是另一种情况(非常常见,但有些特殊)。

它只是减少接收器的参考计数

它只是减少接收器的参考计数

你将释放你自己,这意味着对象声明它自己不必仍然存在。如果没有其他人保留该对象,则该对象将死亡并释放其内存

您几乎没有理由这样做,除非您想创建不受任何其他人控制且可自我控制的对象。
我的意思是,例如,在这种情况下,你可能想创建一个自我生活的对象,进行一些治疗,当它完成时自杀,而不必告诉其他人它已经完成了

例如,让我们设想一个类,其目的只是向服务器发送消息:


你实例化这个类,一旦它被发出,它就会向服务器发送一条消息,它等待服务器的回答,如果回答是ok,它就会自杀。这样,您就不必从另一个类控制器(其目的不是管理此类事件)中管理任何服务器应答。

您将释放自己,这意味着对象声明自己不必仍然存在。如果没有其他人保留该对象,则该对象将死亡并释放其内存

您几乎没有理由这样做,除非您想创建不受任何其他人控制且可自我控制的对象。
我的意思是,例如,在这种情况下,你可能想创建一个自我生活的对象,进行一些治疗,当它完成时自杀,而不必告诉其他人它已经完成了

例如,让我们设想一个类,其目的只是向服务器发送消息:


你实例化这个类,一旦它被发出,它就会向服务器发送一条消息,它等待服务器的回答,如果回答是ok,它就会自杀。这样,您就不必从另一个类控制器(其目的不是管理此类事件)中管理任何服务器应答。

在许多其他情况下,您可能需要这样做。看看我的答案。在很多其他情况下,你可能会想这样做。看看我的答案。
- (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;
}