2012-03-29 52 views
6

在最近的Xcode 4.3项目模板双下划线差异,因此一些@synthesze被声明为:单,在声明@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; 

回答

3

他们可能不应该使用双下划线,如果他们打算在自己的程序中使用。我希望这只是编写该模板示例的人的疏忽。在实践中,他们不太可能会导致任何问题。

C标准保留所有标识符,以双下划线开始,供实施自己使用。由于Objective-C是C的超集,因此您不应该在Objective-C程序中使用这些标识符。从C规范,部分7.1.3保留标识符

以下划线和一个大写字母或另一个下划线开头,始终保留用于任何用途的所有标识符。

1

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

我从来没有见过C编译器抱怨__ vars,而LLVM似乎并不介意,但它可能不是很好的做法。