6

我有一个我不合成的属性,而是我自己创建了一个 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 对象交互。除非我在关键字中添加强或弱,否则这不会在 XCode 4.2 中编译。

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

4

2 回答 2

1

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

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

属性声明属性
您可以使用表单来装饰属性@property(attribute [, attribute2, ...])。与方法一样,属性的范围仅限于其封闭的接口声明。对于使用逗号分隔的变量名列表的属性声明,属性属性适用于所有命名属性。

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

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

更多信息可以在这里找到。

于 2012-04-05T22:22:00.947 回答
0

博登,

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

其次,@synthesize 不是 nop。它是语言支持 KVO 的机制。虽然您现在可能不会使用它,但您为什么要在未来排除这种使用。

坦率地说,通过不使用@property 中的完整描述或使用@synthesize,IMO,您正在从事过早的优化。您当前的设计不会为您节省消息发送,并迫使您在必要时管理 ivars 的创建和键入。而且您正在失去该语言的功能。

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

安德鲁

于 2012-04-05T15:41:09.530 回答