【问题标题】:Objective-c codingObjective-c 编码
【发布时间】:2013-01-02 15:38:46
【问题描述】:

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

@property (nonatomic, strong) NSString* aString;

这有什么区别

1.@synthesize aString = _aString

2.@synthesize aString;

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

3. anOtherString = aString;

4. anOtherString = self.aString;

5. anOtherString = _aString;

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

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

【问题讨论】:

    标签: objective-c coding-style


    【解决方案1】:

    你的答案在这里:

    1.@synthesize aString = _aString
    

    Ans:您的属性名称是 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。

    【讨论】:

      【解决方案2】:

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

      NSString *tempString = _aString;
      

      NSString *tempString = self.aString;
      

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

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

      _aString = @"";
      

      self.aString = @"";
      

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

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

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

      【讨论】:

      • 谢谢你的重播,你说使用“@synthesize aString = _aString”创建一个私有变量,但是'Anoop Vaidya'说它只是一个别名?
      • 我会支持 Anoop 在这方面的术语。您引用的是同一个变量,所以从技术上讲它是一个别名。我说私有变量是因为我想强调你只能在 .m 文件中使用它。
      猜你喜欢
      • 1970-01-01
      • 2012-10-24
      • 2013-07-02
      • 1970-01-01
      • 2011-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多