2012-08-01 67 views
8

我是Objective-C和XCode的新手,但很高兴看到XCode 4.4现在为我自动合成了我的属性。我想这意味着我不再需要为我的属性输入@synthesize,并且我可以使用self.propertyName = @"hi";来访问它们。xcode 4.4中的自动属性如何合成工作?

我想重写一些示例代码,以便我可以更好地理解它,但此代码实现了自定义getter方法。在示例代码中,该属性是手动合成的,如@synthesize managedObjectContext = __managedObjectContext;。自定义的getter看起来是这样的:

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

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

    return __managedObjectContext; 
} 

在这个人的代码,我看他只是用他的人工合成的访问器get和set。我想到了我的代码,我可以用self.managedObjectContext代替__managedObjectContext,但不能。如果我这样做,我得到一个错误告诉我,我试图分配给readonly属性。这是有道理的,因为该属性被其他编码器定义为只读。

@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext; 

所以,我想讲讲他是如何手动合成他的财产是指,如果他使用了特定的制定者,它可以让他以某种方式设置只读属性。

如果我手动合成属性,就像在我引用的代码中那样,一切都可以回到工作状态,但是这并没有利用新的自动合成。如果我删除readonly,我可以按预期设置此属性,但我觉得我不明白他为什么只读,所以我敢打赌我在那里打破了一些东西。

那么,我错误使用新的自动合成?如果自动合成不是为我创建的,因为readonly,如何使用setter来设置它?

谢谢

+0

他直接访问伊娃。删除一个“_” – Pochi 2012-08-01 08:56:07

回答

10

当XCode的自动综合类,它模拟了以下...

@synthesize foo = _foo; 

所以,你可以用self.foo或object.foo适当地访问数据。

但是,在访问器方法(以及初始化器和dealloc)的实现中,应该直接使用iVar。

请注意,这些iVar有两个下划线。而且,它们正在使用访问器方法进行操作。使用_managedObjectContext,你应该很好去。

+0

两个下划线?看起来像一个给我。 – oliland 2012-08-22 14:34:47

+2

是的,OP问题中的iVars有两个下划线(__managedObjectContext),而自动合成使用。 – 2012-08-22 16:18:44