有人可以解释这个@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_
创buildmanagedObjectContext和setManagedObjectContext:访问器方法,这两个方法都由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可用性指数中进行了解释 。