ios – xcode 4.4中的自动属性如何合成?

我是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;
}

在这个人的代码中,我看到他只是使用他的手动合成访问器来获取和设置.我在我的代码中想到,我可以用self.managedobjectContext替换__managedobjectContext,但是nope.如果我这样做,我会收到一个错误,告诉我我正在尝试分配给readonly属性.这是有道理的,因为该属性被其他编码器定义为只读.

@property (readonly,strong,nonatomic) NSManagedobjectContext *managedobjectContext;

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

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

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

谢谢

解决方法

当XCode自动合成时,它会模拟以下内容……
@synthesize foo = _foo;

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

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

注意,那些iVars有两个下划线.并且,它们在访问器方法中被操纵.使用_managedobjectContext,你应该很高兴.

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...