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
替换为strong
或weak
?
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】:
要同时回答所有三个问题:retain
和 strong
是同义词,所以两者都是正确的。 The documentation 状态
retain
暗示__strong
所有权
strong
暗示__strong
所有权
【讨论】:
感谢您的回复。我确实阅读了关于 ARC 的 Apple 文档。我确实明白保留转化为强大。但是,这并不能解释为什么 Xcode 在创建新的 NSManagedObject(s) 时自动生成的代码会给你@property (nonatomic, retain) 除非我在这里遗漏了什么,这完美地解释了它。 Xcode 创建的代码是正确的,因为保留功能同样强大,那么您的问题在哪里? 如果您在项目上运行 ARC 重构,它会将所有retain
s 转换为 strong
s。所以我的印象是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 定义:强还是保留?的主要内容,如果未能解决你的问题,请参考以下文章
property_getAttributes() 在设置为只读时在保留、强、弱和分配属性之间没有区别
ARC 内存管理:@Property (nonatomic, strong) VS 实例变量