2012-04-05 62 views
6

我有一个属性,我不合成,而是我自己创建一个getter和setter。因此,我认为,ARC关键字(强或弱)没有意义,所以我将它们消除。这在Xcode 4.3上可以正常工作,但是当我的同事在XCode 4.2上打开它们时,编译器会抱怨没有强/弱关键字,所以我指示他再次无意义地输入关键字。哪一个是正确的(有或没有关键字)?我是否需要ARC关键字来处理我没有合成的属性?

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

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

回答

1

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

财产申报和实施
的@property指令声明的属性。一个可选的加括号 属性组提供了有关存储 语义和属性的其他行为的额外细节 - 有关可能的值,请参阅“属性声明属性”。

财产申报属性
可以使用的形式@property(attribute [, attribute2, ...])装饰用 属性的属性。 与方法类似,属性的范围限定在它们的封装接口 声明中。对于使用变量名称的逗号分隔列表 的属性声明,属性属性将应用于所有指定的 属性。

如果使用@synthesize指令告诉编译器创建 存取方法(见“财产执行指令”),它生成的代码 通过关键字给出的规格相匹配。如果 您自己实现访问方法,则应确保其 与规范相匹配(例如,如果指定了副本,则必须 确保您在setter方法中复制输入值)。

如果再使用@dynamic代替@synthesize它告诉你会写自己的方法并阻止它抱怨,当它没有找到合适的方法编译器。

更多信息可查询here

+0

有趣...我会尝试添加动态,看看它是否适用于XCode 4.2 – borrrden 2012-04-05 23:48:56

+1

+1,非常明确的答案 – jmstone617 2012-04-06 13:27:13

0

borrrden,

首先,你为什么要关心的Elid你的记忆政策在你的属性语句?它向您的班级的消费者宣布该政策是什么。你不想让他们知道吗?

其次,@synthesize不是一个nop。这是语言支持KVO的机制。虽然你现在可能没有使用它,但为什么你会在未来使用这种方法。

坦率地说,通过不使用@property中的完整描述或使用@synthesize,您就是IMO参与过早优化。您当前的设计不救你的消息分派和力量如果必要的话,您可以管理,创建和实例变量的类型。你正在失去语言的特征。

除非你有一个很好的理由,以获得最好的OBJ-C V2 +模式的边界之外,你还没有上市的话,我会恢复使用标准模式。那么你的问题就会消失。

Andrew

+0

通常有很好的理由来编写自己的方法。 (如计算属性,验证等) – lnafziger 2012-04-05 22:27:28

+0

'@ synthesize'与KVO完全没有关系。您可以使用KVO,而无需编写'@ synthesize',同时提供您自己的定制setter和getters。 – 2012-04-05 22:35:42

+0

这不是关于优化,而是关于逻辑。这些属性没有iVar这些属性通过依次设置它们的属性与Core Data对象进行交互。在这种情况下,你认为他们是强还是弱?也许和我设置的后续对象属性一样。只要不引起任何副作用,我不介意将它们写入。 – borrrden 2012-04-05 23:48:18

相关问题