【问题标题】:Naming convention in Objective C /C , start with "_"?Objective C /C 中的命名约定,以“_”开头?
【发布时间】:2011-02-09 06:39:20
【问题描述】:

我看到 ppl 像这样定义变量:

b2World *_world;
b2Body *_body;
CCSprite *_ball;

而不是

b2World *world;
b2Body *body;
CCSprite *ball;

我熟悉第二个,但不熟悉第一个。因此,我查看了有关命名约定的 Wikipedia:

名称以双下划线开头 或下划线和大写字母 保留用于实施 (编译器,标准库)和 不应使用(例如 __reserved 或 _保留)。

那么,以“_”开头的有什么特殊含义吗?

我看到的使用“_”开头的代码在这里:

http://www.raywenderlich.com/457/intro-to-box2d-with-cocos2d-tutorial-bouncing-balls

The wiki page.

【问题讨论】:

    标签: c objective-c programming-languages naming-conventions


    【解决方案1】:

    在一些 Objective-C 开发人员之间有一个长期的约定,即在实例变量前加上下划线。它可以在以下几个方面有所帮助:第一,它可以更容易地在 .m 文件中发现实例变量;第二,它使开发人员不必为方法参数想出创造性的名称,以避免与实例变量名称冲突;第三,正如其他人所指出的,它表明实例变量是私有的,因此不应在整个代码中随意访问。

    事实上,我主张避免在访问器(getter 和 setter)、-dealloc-init... 之外的方法中直接访问实例变量。并不是说您永远不应该在其他任何地方使用它们,但您至少应该在直接在其他方法中使用实例变量之前考虑一下。

    【讨论】:

      【解决方案2】:

      这真的很有帮助,但大多数人不知道为什么,这很遗憾。 Apple 使用下划线来分隔其他对象访问特定对象变量的方式和特定对象访问其自身变量的方式。 现在这听起来可能有点奇怪,但想象一下:你可能都认出了下面的编译器警告

      .h
      @property (nonatomic, retain, readonly) UITableView *tableView;
      
      .m
      - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
          return [self loadSomethingElseForTableView:tableView];
      }
      

      这将导致编译器警告,因为它不知道您引用的是局部变量“tableView”还是实例变量。 因此,Apple 建议您将以下内容添加到 @implementation 的顶部。

      @synthesize tableView = _tableView;
      

      现在,当您引用 _tableView 时,编译器知道您指的是实例变量,而不是本地变量。

      此外,这使得理解 Obj-C 中的垃圾收集变得更加容易,并防止犯常见错误。

      例如,当执行以下操作时:

      @property (nonatomic, retain, readonly) NSString *title;
      
      - (id)initWithTitle:(NSString *)title {
          if ((self = [super init])) {
              self.title = title; // Is not possible, since it's read only.
              title = title; // Is not possible, since it's the same (local) variable.
              // Changing the method to initWithTitle:(NSString *)aTitle;
              title = aTitle;
          }
          return self;
      }
      

      现在,由于您不使用默认设置器(实际上,您不能,因为它是只读的)您需要自己保留变量。 当你给每个实例变量一个前缀时,这更容易记住(所以你知道你需要自己保留它)。

      因此,基本上,了解self.variable 和 (_)variable 之间的区别很重要。 (即:self.variable 映射到 [self setVariable:...]variable 直接映射到您的指针。

      此外,当您将其添加为私有变量时,如下所示:

      @interface TSSomeObject : NSObject {
      @private
          NSString *_privateTitle;
      }
      @end
      

      下划线前缀并不是必须的,除非你可能会遇到同名的局部变量。除此之外,这也是提醒您它是本地指针并且在将变量分配给对象时需要保留(和释放)变量的简单方法。

      错误的是创建一个带有下划线前缀的属性,像这样:

      @property (nonatomic, retain) NSString *_title;
      

      这确实是错误的,我什至不会解释原因;)


      所以是的!你真的应该使用下划线前缀,它使你的代码更容易阅读,并被编译器解释!在 Xcode 4 中,Apple 甚至将这些 @synthesizes 添加到默认模板中。

      【讨论】:

        【解决方案3】:

        通常它们用于不应在当前文件/模块/命名空间/其他内容之外访问的变量,在不支持使用 private 关键字之类的限制访问的语言中

        【讨论】:

          【解决方案4】:

          https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingIvarsAndTypes.html#//apple_ref/doc/uid/20001284-1001757

          根据上述文档中的约定和建议,您应该在 ivars 前加上下划线。

          诚然,它是指为属性显式设置 ivars。

          但是用法是一样的,在任何看到的地方都表明它的用法。

          然而,我对这种可能性持开放态度,即在这种情况下,使用下划线前缀 ivar 可能会向用户发出他们做错了什么的信号。同时,后缀下划线可用于直接访问的纯 ivars。

          这个博客有一些经验丰富的从业者的好想法,它建议使用前缀下划线。

          http://blog.bignerdranch.com/463-a-motivation-for-ivar-decorations/

          无论您选择使用前缀下划线来装饰自己的 ivars,至少有一些证据表明某种装饰可以帮助您避免错误。加前缀的下划线是最常见的装饰。

          【讨论】:

            【解决方案5】:

            Apple 为自己的私有 ivars 和方法保留以下划线开头的名称。在任何 Apple 平台上的 Objective-C 中,建议您不要在标识符前加上下划线。

            http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingMethods.html

            【讨论】:

            • -1 Apple保留带有下划线前缀的实例变量。恰恰相反,他们鼓励所有开发人员为 ivars 使用下划线前缀;事实上,Xcode 4.5 中引入的自动合成机制默认会合成带前缀的 ivars。
            • @jlehr:你的后一点是不正确的。默认情况下,自动合成的 ivars 与属性具有完全相同的名称。
            • @JeremyP:jlehr 关于他之前的观点是正确的。您的链接指向一篇关于命名方法的文章,而不是 ivars。可以在此处找到与 ivar 相关的伴侣:developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/…
            • 更正我之前的声明:默认 @synthesize 指令合成的 ivars 具有完全相同的名称。使用较新版本的 clang 自动合成的 ivars 带有下划线前缀(正如 @jlehr 所说),而明确的 @synthesize property_name=ivar_name 声明当然会按照他们的要求进行。
            • Slipp 指出,这个答案是不正确的,Apple 确实明确建议对 ivars 使用前缀下划线。尽管我承认,这是在综合属性的背景下。他们是否更普遍地推荐它,不知道......
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多