fellow StackOverflow user告诉我在释放属性时不应该使用getter方法:
@property(nonatmic, retain) Type* variable;
@synthesize variable;
// wrong
[self.variable release];
// right
[variable release];
他没有详细解释原因。它们在我看来是一样的。My iOS book说,属性上的getter将如下所示:
- (id)variable {
return variable;
}
那么,这不意味着[self variable]
、self.variable
和variable
都是一样的吗?
发布于 2011-09-01 03:46:32
典型的getter看起来更像这样:
- (id)variable {
return [[variable retain] autorelease];
}
因此,如果您使用[self.variable release]
,那么当您只想释放对象并导致对象被延迟释放(当自动释放池被耗尽时)时,您实际上并不需要额外的retain
和autorelease
。
通常,您可以使用self.variable = nil
,它的优点是还可以将变量设置为nil
(避免因指针悬空而崩溃),或者使用[variable release]
,如果您的setter具有自定义逻辑,则它是最快的,并且在dealloc
方法中可能更合适。
发布于 2011-09-01 03:29:38
对于没有自定义访问器的保留属性,可以通过以下方式释放对象:
self.variable = nil;
这样做的效果是将ivar (如果您只声明了属性,则不能称为“变量”)设置为nil,并释放先前的值。
正如其他人所指出的,直接释放ivar (如果可用)或使用上面的方法都是可以的-你不能做的是对从getter返回的变量调用release。
发布于 2011-09-01 03:25:30
您可以选择编写自定义的getter行为,这可能会导致完全不同的行为。因此,您不能总是假设[variable release]
与[self.variable release]
具有相同的结果。
同样,你也可以编写自定义属性,而不需要一个独占的ivar来支持它们。如果你开始从getter返回的引用中释放对象,它会变得很混乱!
可能还有其他我不知道的原因...
https://stackoverflow.com/questions/7262268
复制相似问题