0

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

@interface BPGameKitMPGameEngine()

    @property (readwrite, assign) BPCharacterInstance* currCharacter;

@end

然后编译器出现了一个错误(奇怪的是,两天后我无法再重现),暗示需要一个@synthesize 语句,所以我@synthesize currCharacter = _currCharacter;在子类(BPGameKitMPEngine)中添加。

我没有超类中添加类似的匿名类别,因为我只是直接使用 iVar。然后我发现在 super( )的调用中调用_currCharacter = someCharacter;的方法中的行根本什么也没做。出现在调试器中,并且不是 nil,但是在执行该行之后,仍然存在. 奇怪的是,在子类中添加一个类似的匿名类别解决了这个问题,就像删除了一样(这不再导致 Xcode 抱怨编译器错误)。BPGameEngineBPGameKitMPEngine[super methodContainingAssignmentToCurCharIvar]_currCharactersomeCharacter_currCharacternil@synthesize

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

4

2 回答 2

2

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

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

当然你可以绕过私人访问......以下应该工作:

@interface BPGameKitMPGameEngine ()

   - (void) setCurrCharacter:(int)value;

@end

和:

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

高温高压

于 2014-01-20T21:37:35.833 回答
0

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

  • BPGameKitMPGameEngine为被调用创建一个新的类扩展文件Private
  • 将该文件 ( #import "BPGameKitMPGameEngine_Private.h") 导入BPGameKitMPGameEngine.mBPGameKitMPEngine.m.
  • 从 中删除现有的类扩展代码BPGameKitMPGameEngine

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

于 2014-01-20T21:31:34.597 回答