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.managedObjectContext
replaceself.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,你应该很好去。