【问题标题】:Xcode4 templates now use underscore on iVars?Xcode4 模板现在在 iVars 上使用下划线?
【发布时间】:2011-09-02 15:12:12
【问题描述】:

我注意到,对于 Xcode4,Apple 更新了应用程序模板,在实例变量之前包含下划线。

// Xcode4
@property (nonatomic, retain) IBOutlet UIWindow *window;
@synthesize window = _window;

.

// Xcode3
@property (nonatomic, retain) IBOutlet UIWindow *window;
@synthesize window;

我知道对此usefulness 有不同的看法,但我只是好奇更新的模板是否在哪里:

  • (1) 突出新的最佳实践。
  • (2) 展示 Apple 是如何做事的,但意味着您要以旧方式做事。
  • (3) 个人口味,没关系。

【问题讨论】:

  • 看看this问题。
  • 在这种情况下是正确的,因为它指的是在 Apple 框架中声明的 ivar。您仍然不应该在自己的 ivar 名称中使用单前导下划线。
  • 谢谢@NSResponder,这就是我要找的,非常感谢......
  • 我不认为 N​​SResponder 是正确的。因为 Apple 自己的文档现在建议在您自己的变量中使用它。见developer.apple.com/library/ios/#documentation/iphone/…。相反,它看起来像是 Apple 的政策逆转,我认为这是一个很好的政策,因为 ivars 和访问它们的属性之间的混淆较少。

标签: iphone objective-c cocoa-touch xcode3to4


【解决方案1】:

这很有趣,因为在过去(iOS 之前),Apple 曾经discourage the use of underscore prefixes for ivars

避免使用下划线作为前缀表示私有,尤其是在方法中。 Apple 保留使用此约定。第三方使用可能会导致命名空间冲突;他们可能会在不知不觉中用自己的私有方法覆盖现有的私有方法,从而带来灾难性的后果。有关私有 API 应遵循的约定的建议,请参阅“私有方法”。

但是使用现代的 Objective-C 运行时,我相信子类中的 ivar 命名冲突已经被消除,所以这不再是问题了。所以我认为这就是他们让模板默认使用下划线前缀的原因,以匹配 Apple 内部代码的外观。

【讨论】:

  • Ivar 命名冲突尚未消除——如果超类在其 @interface 块中声明了 ivar,则没有子类可以声明具有相同名称的 ivar。也就是说,现代运行时具有非脆弱 ABI,它允许 类扩展 定义自己的 ivars,这在某些情况下允许完全从 @interface 块中删除 ivars,这反过来又, 有助于防止名称冲突。
猜你喜欢
  • 1970-01-01
  • 2012-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多