【问题标题】:Do I need ARC keywords for properties that I don't synthesize?对于我不合成的属性,我是否需要 ARC 关键字?
【发布时间】:2012-04-18 19:25:03
【问题描述】:

我有一个不合成的属性,而是我自己创建了一个 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 中编译。

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

【问题讨论】:

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


    【解决方案1】:

    借,

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

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

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

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

    安德鲁

    【讨论】:

    • 编写自己的方法通常有充分的理由。 (如计算属性、验证等)
    • @synthesize 与 KVO 毫无关系。您无需编写 @synthesize 即可使用 KVO,同时提供您自己的自定义 setter 和 getter。
    • 这不是关于优化,而是关于逻辑。这些属性没有 iVar 属性通过依次设置它们的属性与 Core Data 对象交互。在这种情况下,您认为它们是强还是弱?可能与我设置的后续对象属性相同。只要不引起任何副作用,我不介意写出来。
    • Core Data ivars 都很强大。我只有在有特定理由时才使用weak。我称此设置为保留。如果我可能需要某些东西,那么我会保留它。如果它导致保留周期,我将其设为weak。我认为这是一个工程问题,而不是逻辑问题。工程部分是关于代码维护的。 Obj-C 是一个主要是自我记录的环境。不要通过删除属性标记来削弱它。顺便说一句,我认为默认的@property 内存策略是strong。删除它不会改变编译器的行为。 IOW,你让你的代码变得不透明——为了什么目的?
    【解决方案2】:

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

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

    属性声明属性
    你可以用 使用@property(attribute [, attribute2, ...]) 形式的属性。 与方法一样,属性的范围仅限于它们的封闭接口 宣言。对于使用逗号分隔列表的属性声明 变量名称,属性属性适用于所有命名的 属性。

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

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

    更多信息可以在here找到。

    【讨论】:

    • 有趣...我会尝试添加一个动态,看看它是否适用于 XCode 4.2
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-22
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多