有人可以解释这个@synthesize语法吗?

时间:2010-07-18 20:53:06

标签: ios objective-c nsmanagedobject

我正在关注最新iOS SDK中带有核心数据的示例导航视图模板。

rootViewController.m文件中,我在@synthesize行中看到了这一点:

@synthesize fetchedResultsController=fetchedResultsController_, managedObjectContext=managedObjectContext_;

头文件的位置是:

@private
NSFetchedResultsController *fetchedResultsController_;
NSManagedObjectContext *managedObjectContext_;

}

@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;

这是否意味着它们都是@synthesized(创建getter& setter)但是一个设置为等于另一个? fetchedResultsController文件似乎也是rootViewController.m文件中的一种方法。

这个模板在这个SDK版本中发生了变化,我正在关注Apress的更多iPhone 3开发,这确实让人感到困惑。

2 个答案:

答案 0 :(得分:3)

@synthesize语法中,= 的左侧(这只是合成用于此语法的字符,而不是赋值运算符)是名称属性(及相关方法)=的右侧是用于命名属性的实例变量。

在上面的示例中,@synthesize fetchedResultsController=fetchedResultsController_使用 fetchedResultsController _ 创建 fetchedResultsController getter方法和 setFetchedResultsController: setter方法用于存储的实例变量。

同样,@synthesize managedObjectContext=managedObjectContext_创建 managedObjectContext setManagedObjectContext:访问器方法,两者都由 managedObjectContext _ 实例变量支持。

如果未明确指定“右侧”(如果声明为@synthesize fetchedResultsController, managedObjectContext;,则复合将假定实例变量的名称与属性相同。一些Objective-C程序员不喜欢将它留在这种默认行为,因为很容易犯下打算设置本地函数范围变量而不是设置实例变量的错误。对所有实例变量使用下划线可以使它们的意图更清晰。

为了清楚起见,可以通过逗号分隔将多个@synthesize属性组合成一个;每个仍然是它自己的声明,以便上述完全等同于:

@synthesize fetchedResultsController=fetchedResultsController_;
@synthesize managedObjectContext=managedObjectContext_;

同样没有价值,在较新的Xcode / iOS版本中,如果没有明确定义,将自动创建实例变量,如果未指定,也会假设@synthesize声明。这些差异在Apple的快速参考Objective-C Feature Availability Index中有所解释。

答案 1 :(得分:-1)

只有第一个(在Synthesis语句的lhs上)与getter和setter合成,并成为“公共”实例变量。

后者(使用下划线)仍然可以在实例中使用,但不会在实例外部公开。它们都引用相同的内存地址。