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 来释放它吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用objc runtime实现iOS懒加载

OBJC类扩展之属性字典NSObject+Property

在 NSPredicate 中使用 NSNumber == nil 过滤值

objc:具有 NSString 的强属性

防止 Obj-C 代码将 `nil` 传递给具有非可选参数的 Swift 方法

为啥这个 ObjC 块在释放时不释放其捕获的引用?包括失败的单元测试