ARC不消除Objective-C中对属性的需求吗?

时间:2012-05-14 14:41:10

标签: objective-c properties automatic-ref-counting ivar

  

可能重复:
  With ARC why use @properties anymore?

注意:我实际上并不认为我们可以废除属性,但我试图理解为什么不能解释。 :)

回顾this question,我们使用属性的主要原因似乎是避免内存管理问题。换句话说,通过创建属性,我们不必写出所有这些保留和释放方法:

- (void) setOtherObj:(MyOtherObject *)anOtherObject {

    if (otherObject == anOtherObject) {
    return;  
    }

    MyOtherObject *oldOtherObject = otherObject; // keep a reference to the old value for a second
    otherObject = [anOtherObject retain]; // put the new value in  
    [oldOtherObject release]; // let go of the old object
} 

由于ARC现在处理这个问题,我们是不是可以一起取消属性,只需通过像otherObject = anotherObject那样设置ivars?

3 个答案:

答案 0 :(得分:5)

内存管理一个使用属性的原因,但不是唯一的。您只能在自己的类中使用纯实例变量,但不能在外部使用。为此,你仍然需要一个房产。

属性甚至不必由实例变量支持。例如,您可能在视图中具有backgroundColor属性,该属性实际返回并设置某些私有子视图的backgroundColor属性。 或者,假设您有一个readonly name属性实际上与实例变量不对应,但只是连接firstNamelastName

使用属性而不是普通的实例变量访问还允许您更轻松地实现延迟初始化,而无需在很多地方更改代码。

如果你只使用一个属性为你处理内存管理,你现在可以在很多情况下没有它,但是当你后来决定它不应该简单地映射到一个属性时,使用属性仍然会给你更大的灵活性实例变量。

答案 1 :(得分:2)

避免内存问题是属性非常有用的副产品。它们的主要用途仍然是访问控制(readonlyreadwrite)和信息隐藏(即获取和设置属性的逻辑可以随时更改,而不需要对类的用户进行更改)。此外,如果您需要copy语义,它仍可用于ARC。

答案 2 :(得分:0)

ARC将为您管理与内存相关的问题。 属性是一种方便获取/设置值的方法。所以ARC的到来并不意味着财产的终结。