0

我真的对使用礼仪感到困惑。如果我声明这个

@property (nonatomic, strong) NSString* aString;

这有什么区别

1.@synthesize aString = _aString

2.@synthesize 字符串;

如果我想使用它,有什么区别:

3. anOtherString = aString;

4. anOtherString = self.aString;

5. anOtherString = _aString;

我知道 _aString 是 ivar,但问题是 1、2、3、4、5 之间的组合。

例如,如果我使用 2 和 4,我是在传递对 anOtherString 的引用还是它的副本?我通常使用 2 和 4 是传递参考的最佳选择吗?

4

2 回答 2

1

当您使用您的@synthesize声明时,这会为您生成 getter/setter。当您使用@synthesize声明时@synthesize aString = _aString,您正在制作它,以便您的 getter/setter 方法将使用setAStringand aString。您正在创建一个名为_aString. 这意味着在你的类中,你可以通过调用来获取这个变量

NSString *tempString = _aString;

或者

NSString *tempString = self.aString;

后者使用生成的 getter 方法来检索aString.

您还可以使用以下方法设置变量:

_aString = @"";

或者

self.aString = @"";

后者使用生成的setter方法。这非常重要,因为如果您已将属性声明为保留(现在为强)或复制,那么您的 setter 方法会执行一些您可能不知道的逻辑(请查看强/复制/弱属性)。本质上,如果您有一个强大的属性并且您使用生成的 setter,您的代码会释放它对该变量的先前引用,并创建一个对您分配给变量的内容的强引用。

我个人尝试始终使用 getter/setter 方法,除非它是弱引用(那么它真的没关系)。我通常也总是使用该@synthesize aString = _aString方法,以便我可以aString选择命名方法参数。它有助于避免命名冲突。

如果我能以任何方式澄清,请告诉我。

于 2013-01-02T15:48:13.100 回答
1

你的答案在这里:

1.@synthesize aString = _aString

回答:您的属性名称是 aString,但您正在创建别名 _aString。现在您可以访问aString,您的访问器只能由_aString 使用。从 Xcode4.4 开始,此语句默认出现。

2.@synthesize aString;

Ans: 这是 Objective-c 合成属性的基本风格。从 Xcode4.4 开始,此语句将覆盖上述语句。

3.anOtherString = aString;

您正在通过引用变量/别名访问该属性。

4.anOtherString = self.aString;

您正在使用访问器来获取其值。

5.anOtherString = _aString;

您正在访问该属性本身。

I usually use 2 and 4 is that the best choice for passing a reference ?

Ans : 这是一个很好的方法,作为self。使您的类 KVC 兼容。

于 2013-01-02T16:53:00.963 回答