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


80

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

@property (nonatomic, retain) NSString * someString;

1)不应该 retain现在应该用strong或代替weak吗?

2)为什么自动生成的代码仍然使用 retain

3)什么是正确的替代品 retain在此财产声明中?

我目前正在使用调试问题NSFetchRequest,并且我认为这可能是问题的根源。有什么想法吗?


您现在应该接受答案。
Rivera 2014年

Answers:


110

1)现在不应该用强者或弱者来代替吗?

不可以。它们是不同的。坚强是保留的100%同义词;他们是相同的。您可以使用任何一个,因此这里没有“应该”。如果愿意,您可以用Strong代替keep,但不必这样做。

2)为什么自动生成的代码仍然使用保留

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

3)此财产声明中保留的正确替代方法是什么?

无需更换保留。

我目前正在使用NSFetchRequest调试问题,并且我认为这可能是问题的根源。有什么想法吗?

不是。


9
不过,我认为,对于一个痴迷于(并且正确地!)对Apple Way的标准和合规性的社区来说,仅在合成模型中保留保留是很不理想的。我变成坚强只是为了学究。首先,在不多的其他一些小事情中,使不正确的语法的大项目变得容易一些。
埃里克·戈德堡

12
不确定到底是什么情感架构。您能否在“冷清的一天”中提供一个示例?;-) false和NO是同义词,但是按照惯例,在Objective-C中使用NO。有理由保持一致;保持一致就可以了,但证明有价值的责任在于一项违反惯例的行为,而不是坚持这一惯例的行为。
埃里克·戈德堡

9
出于所有应有的尊重,@ EricGoldberg确实有一点:约定很重要。而且由于您将要__strong放在代码的其他位置(没有__retain),因此您可能希望切换到usingstrong以获得一致性。这类似于以一致的方式缩进代码,即使没有此代码代码也可以正常运行。
丹·罗森斯塔克2011年

3
@matt:如果您看我的原始评论,即您指责我“情感地”编码(无论是哪种编码)的评论,您会发现我使用了“ posit”和“只是为了学究”之类的字眼。我实际上建议“应该”而不是“是”。
埃里克·戈德堡

1
所有编程都与成语有关。没有其他问题。所有编程都是同义词,整个编程的工程实践都是使用当前的习惯用法,以便为客户端的代码增加价值。
Fattie 2014年

40

回答所有三个问题: retainstrong是彼此的同义词,因此两者都是正确的。文档说明

retain暗示__strong所有权

strong暗示__strong所有权


感谢您的回复。我确实在ARC上阅读了Apple文档。我确实知道保留会转化为强大。但是,这不能解释为什么Xcode在创建新的NSManagedObject(s)时自动生成的代码会为您提供
@property

3
除非我在这里缺少任何东西,否则就可以完美解释。Xcode创建的代码是正确的,因为保留功能同样强大,所以您的问题在哪里?
Phlibbo 2011年

6
如果在项目上运行ARC重构,它将把所有retains转换为strongs。所以我的印象是这strong是首选属性,但是NSManagedObject生成器尚未更新。但这只是一个猜测;苹果公司也许没有人认为这种区别很重要。
理论

4

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


3

“保留”等于“强”。

例如,使用“ strong”:

@property (nonatomic, strong) NSString * someString;

以“ __strong”为例:

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

在Apple Docs上。说:

属性属性

关键字弱和强被引入为新的声明属性属性,如以下示例所示。

// 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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.