ARC 的@property 定义:强还是保留?

Posted

技术标签:

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

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

@property (nonatomic, retain) NSString * someString;

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

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

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

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

【问题讨论】:

你现在应该接受答案了。 【参考方案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

【讨论】:

以上是关于ARC 的@property 定义:强还是保留?的主要内容,如果未能解决你的问题,请参考以下文章

ARC 如何确定是使用保留还是复制?

带有块和保留循环的 ARC

property_getAttributes() 在设置为只读时在保留、强、弱和分配属性之间没有区别

ARC 内存管理:@Property (nonatomic, strong) VS 实例变量

Objective-C 声明的@property 属性(非原子、复制、强、弱)

OC基础--ARC的基本使用