在声明@property时,使用单下划线和双下划线的区别是什么?

6
在最近的Xcode 4.3项目模板中,一些@synthesize被声明为:
@synthesize window = _window;
@synthesize managedObjectContext = __managedObjectContext;
@synthesize managedObjectModel = __managedObjectModel;
@synthesize persistentStoreCoordinator = __persistentStoreCoordinator;
@synthesize navigationController = _navigationController;

有些标识符的前缀是双下划线(__)。为什么?

readonly属性有关吗?

@property (strong, nonatomic) UIWindow *window;
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
@property (strong, nonatomic) UINavigationController *navigationController;
2个回答

3
如果它们旨在用于自己的程序中,他们可能不应该使用双下划线。我认为这只是那个模板示例作者的疏忽。实际上,它们不太可能导致任何问题。
C标准为所有以双下划线开头的标识符保留实现的专用标识符。由于Objective-C是C的超集,因此您也不应在Objective-C程序中使用这些标识符。从C规范第7.1.3节“保留的标识符”中可以看到:

所有以下划线和大写字母或其他下划线开头的标识符都始终保留供任何使用。


1

在这种情况下可能是这样的。一般来说,苹果倾向于使用带有前缀 _ 的名称来引用变量的外部副本(例如当作为函数传递时或直接引用而不是属性)。编写该代码的人可能认为通过添加额外的 _ 来实现只读是聪明的,但这通常是不好的做法,因为 C 保留 __ 用于指定编译器指令。

我从未见过 C 编译器抱怨 __ 变量,而 LLVM 似乎也不介意,但这可能不是一个好的做法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接