2

我正在关注最新 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 开发,这真的很困惑。

4

2 回答 2

3

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

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

同样,@synthesize managedObjectContext=managedObjectContext_创建managedObjectContextsetManagedObjectContext:访问器方法,它们都由managedObjectContext_实例变量支持。

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

需要说明的是,多个@synthesize属性可以通过逗号分隔组合为一个;每个仍然是它自己的声明,因此上述完全等同于:

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

同样一文不值,在较新的 Xcode/iOS 版本中,如果未明确定义实例变量将自动创建,如果未指定,也会假定 @synthesize 声明。Apple 的快速参考Objective-C 功能可用性索引中解释了这些差异。

于 2013-03-11T00:40:58.070 回答
-1

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

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

于 2010-07-18T21:01:32.670 回答