我是Objective-C和XCode的新手,但我很高兴看到XCode 4.4现在自动为我合成了我的属性。我认为这意味着我不再需要输入@synthesize作为我的属性,并且我可以使用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;
}
在这个人的代码中,我看到他只是使用他的手动合成访问器来获取和设置。我在我的代码中想到,我可以用__managedObjectContext
替换self.managedObjectContext
,但不是。如果我这样做,我会收到一个错误,告诉我我正在尝试分配给readonly
属性。这是有道理的,因为该属性被其他编码器定义为只读。
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
所以,我想一下他如何手动合成他的属性意味着如果他使用指定的setter,它允许他以某种方式设置readonly属性。
如果我手动合成属性,就像我引用的代码一样,一切都恢复正常,但是没有使用新的自动合成。如果我删除了readonly
,我可以像预期的那样设置这个属性,但我觉得我不明白他为什么只读它,所以我打赌我在那里打破了。
那么,我是否误用了新的自动合成?如果自动合成没有为我创建,因为readonly我如何使用setter设置它?
谢谢
答案 0 :(得分:10)
当XCode自动合成时,它会模拟以下内容......
@synthesize foo = _foo;
因此,您可以使用self.foo或object.foo来适当地访问数据。
但是,在访问器方法(以及初始化器和dealloc)的实现中,您应该直接使用iVar。
注意,那些iVars有两个下划线。并且,它们在访问器方法中被操纵。使用_managedObjectContext,你应该好好去。