为什么分配给这个ivar没有效果?

时间:2014-01-20 20:57:11

标签: objective-c synthesize

我有一个类BPGameEngine,具有只读属性currCharacter。在过去,我一直在_currCharacter = someCharacter;内直接分配到ivar(如BPGameEngine)。在一个子类中,我发现自己需要写入此属性,因此在匿名类别中重新声明它,如此

@interface BPGameKitMPGameEngine()

    @property (readwrite, assign) BPCharacterInstance* currCharacter;

@end

然后编译器出现错误(奇怪的是,两天后我再也无法重现了),这提到需要@synthesize语句,所以我在子类中添加了@synthesize currCharacter = _currCharacter;({{1 }})。

我做了在超类中添加类似的匿名类别,因为我只是直接使用iVar。然后我发现调用超级(BPGameKitMPEngine_currCharacter = someCharacter;调用的BPGameEngine方法内的行BPGameKitMPEngine根本没有做任何事情[super methodContainingAssignmentToCurCharIvar]出现在调试器中,_currCharacter不是nil,但在执行该行后,someCharacter仍为_currCharacter。奇怪的是,在子类中添加类似的匿名类别解决了问题,删除nil(不再导致Xcode抱怨编译器错误)。

@synthesize的不一致要求似乎一定是Xcode中的一个错误,但其余部分让我感到难过。有人可以解释在子类中使用@synthesize的问题吗?

2 个答案:

答案 0 :(得分:2)

支持属性的自动合成实例变量对于创建它的类是私有的。因此,您不能(直接)将只读属性扩展为在子类中读写一个 - 没有对原始实例变量的访问权限

您应该会遇到各种错误,例如,如果您尝试这样做,则指出您无法从超类访问私有实例变量。听起来你可能已经设法创建了两个属性,每个属性都有自己的支持变量,因此对一个属性的更改并不是对另一个属性的更改 - 但是在这种情况下你是如何管理的,我不知道。

当然,您可以绕过私人访问......以下内容应该有效:

@interface BPGameKitMPGameEngine ()

   - (void) setCurrCharacter:(int)value;

@end

- (void) setCurrCharacter:(BPCharacterInstance *)value
{
   [self setValue:value forKey:@"_currCharacter"];
}

HTH

答案 1 :(得分:0)

我不确定我是否100%理解你的问题,但请执行以下操作:

  • 为名为BPGameKitMPGameEngine的{​​{1}}创建新的类扩展名文件。
  • 将该文件(Private)导入#import "BPGameKitMPGameEngine_Private.h"BPGameKitMPGameEngine.m
  • BPGameKitMPEngine.m
  • 中删除现有的类扩展代码

现在检查它是否按预期工作。