我有一个类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
的问题吗?
答案 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
。现在检查它是否按预期工作。