2010-07-18 82 views
2

我在最新的iOS SDK中使用带有核心数据的示例导航视图模板。有人可以解释这个@synthesize语法吗?

rootViewController.m文件我看到这个在@synthesize行:

@synthesize fetchedResultsController=fetchedResultsController_, managedObjectContext=managedObjectContext_; 

凡头文件是:

@private 
NSFetchedResultsController *fetchedResultsController_; 
NSManagedObjectContext *managedObjectContext_; 

}

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

,这是否意味着他们都是合成的(创建获取者&设置者),但是一个是设置为等于另一个?它也似乎fetchedResultsController也是rootViewController.m文件中的一种方法。

此模板在此SDK版本中发生了变化,我正在关注Apress书籍更多iPhone 3开发,这真的令人困惑。

回答

-1

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

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

+0

好吧,这是有道理的,所以也是我的理解是,公共实例也加载时调用同名的方法?看起来很奇怪,特别是对于Apple文档中的示例应用程序! 我不知道什么是调用fetchedResultsController方法。 – JMWhittaker 2010-07-19 08:05:39

3

@synthesize语法中,=的左侧(这仅仅是综合使用这个语法,而不是赋值运算符的角色)是财产(和相关方法)的名称, =的右侧是用于指定属性的实例变量。

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

同样,@synthesize managedObjectContext=managedObjectContext_创建managedObjectContextsetManagedObjectContext:存取方法,通过managedObjectContext_实例变量都支持。

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

只是要清楚,多个@synthesize属性可以通过逗号分隔组合成一个属性;每个仍是其自己的声明使得上述完全等同于:

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

也没什么看头,在新的Xcode中/ IOS版本的实例变量时,自动将没有明确定义创建和@synthesize声明还假设如果没有指定。这些差异在Apple的快速参考Objective-C Feature Availability Index中解释。

相关问题