我有一个我没有合成的属性,而是我自己创建了一个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中编译。
编辑我想到了一个更相关的事情,其中一个属性是在协议上,我不知道这是否有所作为。
答案 0 :(得分:1)
您引用的声明属性是可选的。引用文档:
财产声明和实施
@property指令声明了一个属性。带括号的可选括号 属性集提供有关存储的其他详细信息 语义和属性的其他行为 - 有关可能的值,请参阅“属性声明属性”。财产声明属性
你可以装饰一个属性 使用@property(attribute [, attribute2, ...])
形式的属性。 与方法类似,属性的作用域为其封闭接口 宣言。对于使用逗号分隔列表的属性声明 对于变量名称,属性属性适用于所有已命名的 属性。如果使用
@synthesize
指令告诉编译器创建 访问器方法(参见“属性实现指令”),. 它生成的代码与关键字给出的规范相匹配。如果 你自己实现了访问器方法,你应该确保它 符合规范(例如,如果您指定副本,则必须 确保你在setter方法中复制输入值。
如果你然后使用@dynamic
而不是@synthesize
,它告诉编译器你将编写自己的方法,并防止它在找不到合适的方法时抱怨。
可以找到更多信息here。
答案 1 :(得分:0)
borrrden,
首先,你为什么要在你的财产声明中忽视你的记忆政策?它向您的班级的消费者宣布该政策是什么。你不想让他们知道吗?
其次,@synthesize不是一个小鸟。它是语言支持KVO的机制。虽然你现在可能没有使用它,但为什么你会在将来排除这种用途。
坦率地说,由于没有在@property中使用完整的描述,也没有使用@synthesize,因此,IMO正在进行过早优化。您当前的设计不会保存消息发送,并强制您在必要时管理ivars的创建和输入。你正在失去语言的功能。
除非你有充分的理由超出首选的Obj-C v2 +模式的范围,并且你没有列出那些,否则我会回到使用标准模式。然后你的问题就消失了。
安德鲁