为什么自动生成的Core Data Project包含managedObjectContext的合成?

时间:2011-05-16 10:30:59

标签: objective-c xcode4

当我们自动创建核心数据对象时,我会看到一行

@synthesize managedObjectContext=__managedObjectContext;

但是,我认为我们不会需要那条线,因为代码也会产生一个函数

- (NSManagedObjectContext *)managedObjectContext
{
    if (__managedObjectContext != nil)
    {
        return __managedObjectContext;
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil)
    {
        __managedObjectContext = [[NSManagedObjectContext alloc] init];
        [__managedObjectContext setPersistentStoreCoordinator:coordinator];
    }
    return __managedObjectContext;
}

那我在这里错过了什么?

为什么要合成我们写的代码?

3 个答案:

答案 0 :(得分:2)

@synthesize指令

  

...告诉编译器它应该为属性合成setter和/或getter方法,如果你不在@implementation中提供它们。

您仍然可以创建自己的实现。

那么为什么要使用@synthesize?将名为__managedObjectContext变量(存储)与名为managedObjectContext属性(公共访问点)相关联。

为什么这样?正如Henrik所说,这样你就可以进行懒惰的存储设置。

答案 1 :(得分:1)

因为@synthesize managedObjectContext=__managedObjectContext;为您的property(实例变量)创建了在对象范围内有效的getter和setter。您正在使用您提到的方法(懒惰)设置它时访问此属性。

答案 2 :(得分:1)

来自关于tuts的伟大核心数据系列:“因为TSPAppDelegate类接口中的属性被声明为readonly,所以没有创建setter方法。第一个@synthesize指令告诉编译器将_managedObjectContext实例变量与我们在类的接口中声明的managedObjectContext属性。这是懒惰加载对象的常见模式。“

http://code.tutsplus.com/tutorials/core-data-from-scratch-core-data-stack--cms-20926