xcode 4.4中的自动属性如何合成工作?

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

我试图重写一些示例代码,以便我可以更好地理解它,但是此代码实现了自定义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; } 

在这个人的代码中,我看到他只是使用手动合成的存取器来获取和设置。 我计算了我的代码,我可以用self.managedObjectContextreplaceself.managedObjectContext ,但是不能。 如果我这样做,我得到一个错误告诉我,我试图分配给一个readonly属性。 这是有道理的,因为该属性被其他编码器定义为只读。

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

所以,我想了解一下他是如何手动合成他的财产,意味着如果他使用指定的setter,它允许他以某种方式设置只读属性。

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

那么,我是否正在使用新的自动合成? 如果由于readonly的原因,自动合成不是为我创build的,我该如何使用setter来设置它?

谢谢

当XCode自动综合,它模拟以下…

 @synthesize foo = _foo; 

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

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

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