【问题标题】:Can someone explain this @synthesize syntax?有人可以解释这个@synthesize 语法吗?
【发布时间】:2011-03-17 16:09:34
【问题描述】:

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

【问题讨论】:

    标签: ios objective-c nsmanagedobject


    【解决方案1】:

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

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

    【讨论】:

    • 好的,有道理,那么我的理解是公共实例在加载时也会调​​用同名的方法吗?看起来很奇怪,尤其是对于 Apple 文档中的示例应用程序!我不知道是什么在调用 fetchedResultsController 方法。
    【解决方案2】:

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

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

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

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

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

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

    同样一文不值,在较新的 Xcode/iOS 版本中,如果未显式定义实例变量将自动创建,如果未指定,也会假定 @synthesize 声明。这些差异在 Apple 的快速参考 Objective-C Feature Availability Index 中进行了解释。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多