对于我未合成的属性,我是否需要ARC关键字?

时间:2012-04-05 02:58:35

标签: ios properties xcode4.2 automatic-ref-counting

我有一个我没有合成的属性,而是我自己创建了一个getter和setter。因此,我假设ARC关键字(强或弱)没有意义,所以我将它们消除。这在Xcode 4.3上运行良好,但是当我的同事在XCode 4.2上打开它们时,编译器抱怨没有强/弱关键字,所以我指示他再次无意义地输入关键字。哪个是正确的(有或没有关键字)?

要明确:我有一个像@property (nonatomic) NSString *foo这样的属性,在.m文件中我实现了-(NSString *)foo-(void)setFoo:(NSString *)foo,并且不包含@synthesize foo。另一个相关细节是没有相应的iVar,而是属性与Core Data对象交互。除非我在关键字中添加strong或弱,否则不会在XCode 4.2中编译。

编辑我想到了一个更相关的事情,其中​​一个属性是在协议上,我不知道这是否有所作为。

2 个答案:

答案 0 :(得分:1)

您引用的声明属性是可选的。引用文档:

  

财产声明和实施
  @property指令声明了一个属性。带括号的可选括号   属性集提供有关存储的其他详细信息   语义和属性的其他行为 - 有关可能的值,请参阅“属性声明属性”。

     

财产声明属性
  你可以装饰一个属性   使用@property(attribute [, attribute2, ...])形式的属性。   与方法类似,属性的作用域为其封闭接口   宣言。对于使用逗号分隔列表的属性声明   对于变量名称,属性属性适用于所有已命名的   属性。

     

如果使用@synthesize指令告诉编译器创建   访问器方法(参见“属性实现指令”),.   它生成的代码与关键字给出的规范相匹配。如果   你自己实现了访问器方法,你应该确保它   符合规范(例如,如果您指定副本,则必须   确保你在setter方法中复制输入值。

如果你然后使用@dynamic而不是@synthesize,它告诉编译器你将编写自己的方法,并防止它在找不到合适的方法时抱怨。

可以找到更多信息here

答案 1 :(得分:0)

borrrden,

首先,你为什么要在你的财产声明中忽视你的记忆政策?它向您的班级的消费者宣布该政策是什么。你不想让他们知道吗?

其次,@synthesize不是一个小鸟。它是语言支持KVO的机制。虽然你现在可能没有使用它,但为什么你会在将来排除这种用途。

坦率地说,由于没有在@property中使用完整的描述,也没有使用@synthesize,因此,IMO正在进行过早优化。您当前的设计不会保存消息发送,并强制您在必要时管理ivars的创建和输入。你正在失去语言的功能。

除非你有充分的理由超出首选的Obj-C v2 +模式的范围,并且你没有列出那些,否则我会回到使用标准模式。然后你的问题就消失了。

安德鲁