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

我正在使用最新的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; 

这是否意味着它们都是合成的(创buildgetter和setter),但是一个设置为等于另一个? 也看起来, fetchedResultsController也是rootViewController.m文件中的一个方法。

这个模板已经改变了这个SDK版本,我正在按照Apress书更多的iPhone 3的发展,这真的是困惑的事情。

只有第一个(在合成语句的lhs)被一个getter和setter合成,并成为“公共”实例variables。

后者(用下划线)在实例内仍然可用,但不暴露在实例之外。 它们都引用相同的内存地址。

@synthesize语法中, = (这只是合成用于该语法的一个字符,而不是赋值运算符)的左侧是属性(和关联的方法)的名称 ,而=的右侧是用于指定属性的实例variables。

在上面的例子中, @synthesize fetchedResultsController=fetchedResultsController_创build一个fetchedResultsController getter方法和一个setFetchedResultsController: setter方法,两者都使用fetchedResultsController_实例variables进行存储。

同样, @synthesize @synthesize managedObjectContext=managedObjectContext_创buildmanagedObjectContextsetManagedObjectContext:访问器方法,这两个方法都由managedObjectContext_实例variables支持。

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

要明确,多个@synthesize属性可以通过逗号分隔合并成一个属性; 每个仍然是自己的声明,以上完全等同于:

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

如果没有明确的定义,新的Xcode / iOS版本实例variables也会自动创build,如果没有指定,也会假定@synthesize声明。 这些差异在Apple的快速参考Objective-Cfunction可用性指数中进行了解释 。