生成代码中的前导下划线

时间:2011-12-07 15:15:39

标签: ios iphone compiler-construction

在阅读Apple生成的模板代码以及文档时,我会看到_(下划线)和__(双下划线)。示例是检查核心数据选项时生成的代码:

@synthesize window = _window;
@synthesize managedObjectContext = __managedObjectContext;
@synthesize managedObjectModel = __managedObjectModel;
@synthesize persistentStoreCoordinator = __persistentStoreCoordinator;

这是什么意思?我理解_是指支持私有变量。 __是什么意思?

2 个答案:

答案 0 :(得分:1)

当您使用getter / setter方法以及何时直接访问ivar时,它常常令人困惑。

替代方案是将ivar命名为与财产不同。一种常见的方法是使用下划线为ivars名称添加前缀,如下所示 -

@interface RootViewController : UITableViewController 
{
    NSDate *_timestamp;
}
@property (nonatomic, retain) NSDate *timestamp;

要连接属性(其名称未更改),sythensize语句将获得一个额外选项:

@implementation RootViewController

@synthesize timestamp = _timestamp;

基本上,如果一个ObjectiveC程序员声明遵循此约定的ivars(他们应该)并使用基本语法@synthesize _window;,那么该属性的用法会变得有点难看:classInstance._window = myWindow[classInstance set_window:myWindow] 。使用语法@synthesize window=_window;允许Obj-C程序员使用流行的编程标准(在_之前的ivars),同时具有使用Apple标准classInstance.window = myWindow和{{1}的属性访问者}。

答案 1 :(得分:0)

Apple的文档建议不要在你的项目中使用单个下划线(因为它由apple本身保留:最着名的例子是_cmd)。但下划线是标识符私有性的传统c风格修饰符,因此双下划线是为变量创建私有标识符的解决方案。

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

  

Cocoa框架中大多数私有方法的名称都有   下划线前缀(例如,_fooData)将它们标记为私有。   从这个事实可以看出两条建议。

Don’t use the underscore character as a prefix for your private methods. Apple reserves this convention.