3

可能重复:
使用 ARC 为什么要再使用@properties?

注意:我实际上不认为我们可以取消属性,但我试图理解为什么不这样做的原因。:)

回到这个问题,我们使用属性的主要原因似乎是避免内存管理问题。换句话说,通过创建一个属性,我们摆脱了写出所有这些保留和释放方法的需要:

- (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 现在处理这个问题,我们是否可以不一起取消属性并通过执行类似的操作来设置 ivars otherObject = anotherObject

4

3 回答 3

5

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

属性甚至不必由实例变量支持。例如,您可能backgroundColor在视图中有一个属性,该属性实际上返回并设置了backgroundColor某些私有子视图的属性。或者,假设您有一个name实际上不对应于实例变量的只读属性,而只是将 和 连接firstName起来lastName

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

如果您只使用属性为您处理内存管理,那么现在在很多情况下都可以不使用它,但是当您以后决定不应该简单地映射到实例变量时,使用属性仍然可以为您提供更大的灵活性。

于 2012-05-14T14:55:48.367 回答
2

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

于 2012-05-14T14:55:41.667 回答
0

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

于 2012-05-14T15:02:01.630 回答