首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Xcode4.4中自动属性合成是如何工作的?

在Xcode4.4中自动属性合成是如何工作的?
EN

Stack Overflow用户
提问于 2012-08-01 12:11:02
回答 1查看 6K关注 0票数 8

我刚接触Objective-C和XCode,但我很高兴看到现在XCode 4.4自动为我合成了我的属性。我认为这意味着我不再需要为我的属性键入@synthesize,例如,我可以使用self.propertyName = @"hi";访问它们。

我正在尝试重写一些示例代码,以便更好地理解它,但这段代码实现了一个自定义的getter方法。在示例代码中,该属性是手动合成的,名为@synthesize managedObjectContext = __managedObjectContext;。定制的getter如下所示:

代码语言:javascript
复制
- (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替换__managedObjectContext,但是不行。如果我这样做,我会得到一个错误,告诉我我正试图分配给一个readonly属性。这是有意义的,因为这个属性被另一个编码器定义为只读。

代码语言:javascript
复制
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;

所以,我想他是如何手动合成他的属性的,这意味着如果他使用指定的setter,它允许他以某种方式设置一个readonly属性。

如果我手动合成属性,就像在我引用的代码中一样,一切都会恢复正常,但这并没有利用新的自动合成。如果我删除了readonly,我可以像预期的那样设置这个属性,但我觉得我不明白为什么他把它设置为只读,所以我打赌我在那里破坏了一些东西。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-01 12:28:19

当XCode自动合成时,它会模拟以下内容...

代码语言:javascript
复制
@synthesize foo = _foo;

因此,您可以使用self.foo或object.foo适当地访问数据。

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

请注意,这些iVars有两个下划线。而且,它们是在访问器方法中操作的。使用_managedObjectContext,您就应该可以使用它了。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11752443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档