ObjC:我可以使用 property = nil 而不是 self.property = nil 来释放它吗?
Posted
技术标签:
【中文标题】ObjC:我可以使用 property = nil 而不是 self.property = nil 来释放它吗?【英文标题】:ObjC: can I use property = nil instead of self.property = nil to release it? 【发布时间】:2012-06-25 04:18:09 【问题描述】:我在 .h 文件中有属性并在 .m 文件中合成,我知道我可以通过以下方式释放它:
self.property = nil;
但是我可以使用吗:
property = nil;
改为?
谢谢!
【问题讨论】:
【参考方案1】:没有。这是因为使用retain
选项(或strong
,如果您使用ARC)生成的@synthesized
方法实际上看起来像这样:
- (void)setValue:(NSString *)newValue
[value autorelease];
value = [newValue retain];
因此,当您执行self.property = nil
时,旧值将被自动释放,而nil
将被保留,无论如何都不会执行任何操作。
当你只做iVar = nil
时,你永远不会释放变量之前包含的对象,所以你会泄漏。
当然,如果您使用的是 ARC(自动引用计数),则不必担心这些。编译器将为您完成工作。在这种情况下,iVar = nil
将具有与 self.iVar = nil
完全相同的效果,尽管有些人可能认为它不太清楚。
【讨论】:
只有在您不使用 ARC 时才适用。如果您使用 ARC,即使不调用 setter 方法,对象也会被释放(假设 property/ivar 的所有权限定符为strong
)。不过,IMO,最好显式调用 setter。
@Andrew 这是一个很好的观点,但由于您不必担心 ARC 中的保留/释放,我假设他在此示例中使用手动引用计数。不过,为了安全起见,我想无论如何我都可以编辑它。
在不使用属性访问器的情况下将 ivar 设置为 nil 有效,但否定了拥有属性的关键点。如果您正在使用访问器,并且您稍后决定在更改属性的值时需要发生一些事情,那么您需要做的就是向访问器方法添加代码。如果你不使用访问器并且想要这样做,你必须找到你直接接触到 ivar 的每个地方。
@rickster 是也不是。使用属性还有其他优点,主要是自动合成的 getter 和 setter。即便如此,我完全同意你的看法,但这不是这个问题的重点。它只处理将它们设置为nil
以释放它们。以上是关于ObjC:我可以使用 property = nil 而不是 self.property = nil 来释放它吗?的主要内容,如果未能解决你的问题,请参考以下文章
在 NSPredicate 中使用 NSNumber == nil 过滤值