声明@synthesize时单引号和双引号的区别

时间:2012-03-29 03:04:59

标签: objective-c xcode

在最近的Xcode 4.3项目模板中,一些@synthesze被声明为:

@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 个答案:

答案 0 :(得分:3)

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

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

部分
  

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

答案 1 :(得分:1)

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

我从未见过C编译器抱怨__变量,而LLVM似乎并不介意,但它可能不是一个好习惯。