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;
}