首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么我不应该使用getter来释放objective-c中的属性呢?

为什么我不应该使用getter来释放objective-c中的属性呢?
EN

Stack Overflow用户
提问于 2011-09-01 03:21:27
回答 4查看 1.1K关注 0票数 17

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.variablevariable都是一样的吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-09-01 03:46:32

典型的getter看起来更像这样:

- (id)variable {
   return [[variable retain] autorelease];
}

因此,如果您使用[self.variable release],那么当您只想释放对象并导致对象被延迟释放(当自动释放池被耗尽时)时,您实际上并不需要额外的retainautorelease

通常,您可以使用self.variable = nil,它的优点是还可以将变量设置为nil (避免因指针悬空而崩溃),或者使用[variable release],如果您的setter具有自定义逻辑,则它是最快的,并且在dealloc方法中可能更合适。

票数 4
EN

Stack Overflow用户

发布于 2011-09-01 03:29:38

对于没有自定义访问器的保留属性,可以通过以下方式释放对象:

self.variable = nil;

这样做的效果是将ivar (如果您只声明了属性,则不能称为“变量”)设置为nil,并释放先前的值。

正如其他人所指出的,直接释放ivar (如果可用)或使用上面的方法都是可以的-你不能做的是对从getter返回的变量调用release。

票数 13
EN

Stack Overflow用户

发布于 2011-09-01 03:25:30

您可以选择编写自定义的getter行为,这可能会导致完全不同的行为。因此,您不能总是假设[variable release][self.variable release]具有相同的结果。

同样,你也可以编写自定义属性,而不需要一个独占的ivar来支持它们。如果你开始从getter返回的引用中释放对象,它会变得很混乱!

可能还有其他我不知道的原因...

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7262268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档