xcode 4.4中的自动属性如何合成工作?
我是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来设置它?
谢谢
当XCode的自动综合类,它模拟了以下...
@synthesize foo = _foo;
所以,你可以用self.foo或object.foo适当地访问数据。
但是,在访问器方法(以及初始化器和dealloc)的实现中,应该直接使用iVar。
请注意,这些iVar有两个下划线。而且,它们正在使用访问器方法进行操作。使用_managedObjectContext,你应该很好去。
两个下划线?看起来像一个给我。 – oliland 2012-08-22 14:34:47
是的,OP问题中的iVars有两个下划线(__managedObjectContext),而自动合成使用。 – 2012-08-22 16:18:44
他直接访问伊娃。删除一个“_” – Pochi 2012-08-01 08:56:07