【问题标题】:@property definitions with ARC: strong or retain?ARC 的@property 定义:强还是保留?
【发布时间】:2011-12-09 10:27:15
【问题描述】:

使用 Xcode 4.2 和 ARC,我注意到自动生成的 NSManagedObject 代码对于属性仍然是这样的:

@property (nonatomic, retain) NSString * someString;

1) 现在不应将retain 替换为strongweak

2) 为什么自动生成的代码还是用retain

3) 在此属性声明中,retain 的正确替换是什么?

我目前正在使用NSFetchRequest 调试一个问题,我认为这可能是问题的根源。想法?

【问题讨论】:

  • 你现在应该接受答案了。

标签: objective-c properties automatic-ref-counting nsmanagedobject retain


【解决方案1】:

1) 现在不应该用强或弱替换retain吗?

没有。你不能用弱替换保留;它们不一样。而strong是100%保留的同义词;它们是相同的。你可以使用任何一个,所以这里没有“应该”。如果你愿意,你可以用 strong 替换 retain,但你不是必须的。

2) 为什么自动生成的代码还是用retain

为什么不呢?见(1)。保留是正确的,所以没有问题。

3) 在这个属性声明中,retain 的正确替换是什么?

不需要替换retain。

我目前正在使用 NSFetchRequest 调试一个问题,我认为这可能是问题的根源。想法?

不是。

【讨论】:

  • 我认为,对于一个痴迷于标准和遵守 Apple Way(s) 的社区(这是正确的!),仅在合成模型中看到保留是低于标准的。我变强只是为了迂腐。一方面,除了其他六种小事情之外,还可以更轻松地确认一个大型项目的语法不正确。
  • 不确定到底什么是情感架构。你能提供一个“寒冷、晴朗的白天”的例子吗? ;-) false 和 NO 是同义词,但我们在 Objective-C 中按惯例使用 NO。有理由保持一致;前后矛盾很好,但证明价值的责任在于打破惯例的一方,而不是遵守惯例的一方。
  • 恕我直言,@EricGoldberg 确实有一点:约定很重要。而且因为您将在代码中的其他位置使用__strong(没有__retain),您可能希望切换到使用strong 以保持一致性。这类似于以一致的方式缩进你的代码,即使没有这个代码也能正常运行。
  • @matt:如果您查看我的原始评论,您指责我“情绪化”(无论是什么)编码,您会发现我使用了“假设”和“只是为了迂腐。”我实际上建议“应该”而不是“是”。
  • 所有的编程都是关于成语的。没有其他问题。所有的编程都是同义词,整个编程的工程实践就是使用当前的成语,从而为客户增加代码的价值。
【解决方案2】:

要同时回答所有三个问题:retainstrong 是同义词,所以两者都是正确的。 The documentation 状态

retain 暗示 __strong 所有权

strong 暗示 __strong 所有权

【讨论】:

  • 感谢您的回复。我确实阅读了关于 ARC 的 Apple 文档。我确实明白保留转化为强大。但是,这并不能解释为什么 Xcode 在创建新的 NSManagedObject(s) 时自动生成的代码会给你@property (nonatomic, retain)
  • 除非我在这里遗漏了什么,这完美地解释了它。 Xcode 创建的代码是正确的,因为保留功能同样强大,那么您的问题在哪里?
  • 如果您在项目上运行 ARC 重构,它会将所有 retains 转换为 strongs。所以我的印象是strong是首选属性,但是NSManagedObject生成器还没有更新。但这只是一个猜测;也许苹果公司没有人认为这种区别很重要。
【解决方案3】:

在 ARC 之前,您必须“释放”一个保留的对象。这意味着保留有对应的部分。在 ARC 之后,您不需要释放。所以用强。它是一个视觉线索,您无需调用 release。

【讨论】:

    【解决方案4】:

    “保留”等于“强”。

    “强”用于例如:

    @property (nonatomic, strong) NSString * someString;
    

    并以“__strong”为例:

    -(void) someMethod
    {
        __strong NSString* vStr = [[NSString alloc] initWithString:@"some string"];
    }
    

    在 Apple 文档上。说:

    属性属性

    关键字weak和strong作为新声明的属性引入,如下例所示。

    // The following declaration is a synonym for: @property(retain) MyClass *myObject;
    property(strong) MyClass *myObject;
    

    苹果文档。 http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-29
      • 1970-01-01
      • 1970-01-01
      • 2011-06-09
      • 1970-01-01
      • 1970-01-01
      • 2014-08-06
      相关资源
      最近更新 更多