2014-01-20 38 views
0

我有一个类,BPGameEngine,只有一个属性,currCharacter。过去,我一直在BPGameEngine内直接分配给伊娃(如_currCharacter = someCharacter;)。在子类中,我发现自己需要写此属性,因此它重新声明在一个匿名类,像这样为什么分配给这个伊娃不起作用?

@interface BPGameKitMPGameEngine() 

    @property (readwrite, assign) BPCharacterInstance* currCharacter; 

@end 

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

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

@synthesize的不一致要求看起来像是Xcode中的一个错误,但其余部分却让我难堪。有人可以解释在子类中使用@synthesize的问题吗?

+0

为什么你的对象属性'assign'?你没有使用ARC? –

+0

我确实没有使用ARC。 –

+0

原始只读属性的声明在哪里?在超类的主界面? –

回答

0

我不知道如果我没有理解你的问题100%,但是,请执行以下操作:

  • 创建一个名为PrivateBPGameKitMPGameEngine一类新的扩展文件。
  • 将该文件(#import "BPGameKitMPGameEngine_Private.h")导入BPGameKitMPGameEngine.mBPGameKitMPEngine.m
  • BPGameKitMPGameEngine删除现有的类扩展代码。

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

2

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

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

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

@interface BPGameKitMPGameEngine() 

    - (void) setCurrCharacter:(int)value; 

@end 

和:

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

HTH

+1

谢谢。这个问题的核心,除了我对另一个问题的误解之外,那就是重新声明最初声明为readwrite的超类中的变量!=在子类中重新声明为readwrite(谢谢你清除它),似乎是Xcode不会除非所有的实现和接口都在同一个文件中,否则实际上并没有提到在超类中使用ivar的警告,这让我相信@synthesize并没有成为另一个ivar。 –