我正在通过他们的“冒险”示例使用精灵工具包,并对属性有疑问...... 例如,我们有一个模型
APAplayer.h
@interface APAPlayer : NSObject
@property (nonatomic) APAHeroCharacter *hero;
a lot of properties...
@end
和场景
Scene.m
@interface APAMultiplayerLayeredCharacterScene ()
@property (nonatomic) APAPlayer *defaultPlayer;
@end
我们有一个代码:
APAplayer *defaultPlayer = self.defaultPlayer;
APAHeroCharacter *hero = nil;
if ([self.heroes count] > 0) {
hero = defaultPlayer.hero;
}
if (defaultPlayer.moveRequested) {...}
我有疑问: 为什么他们创建VZPlayer的新实例,然后为此实例分配属性?如果这样写是什么变化:
APAHeroCharacter *hero = nil;
if ([self.heroes count] > 0) {
hero = self.defaultPlayer.hero;
}
if (self.defaultPlayer.moveRequested) {...}
很抱歉,如果这是一个非常新手的问题,我真的不明白是因为它只是因为5个符号..它是保护程序还是其他什么?主要问题是他们为什么使用本地var而非自我
EDITED
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
APAPlayer *defaultPlayer = self.defaultPlayer;
UITouch *touch = defaultPlayer.movementTouch;
if ([touches containsObject:touch]) {
defaultPlayer.targetLocation = [touch locationInNode:defaultPlayer.hero.parent];
if (!defaultPlayer.fireAction) {
defaultPlayer.moveRequested = YES;
}
}
}
为什么不......
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = defaultPlayer.movementTouch;
if ([touches containsObject:touch]) {
self.defaultPlayer.targetLocation = [touch locationInNode:defaultPlayer.hero.parent];
if (!self.defaultPlayer.fireAction) {
self.defaultPlayer.moveRequested = YES;
}
}
}
答案 0 :(得分:0)
我看到的唯一区别是他们创建的新实例变量defaultPlayer
是VZPlayer
的实例,而defaultPlayer
(APAMultiplayerLayeredCharacterScene的实例变量)是{{的实例1}}。
看起来这可能是一次尝试,但如果是这样,我希望它看起来像这样:
APAPlayer
答案 1 :(得分:0)
在原始代码段中,代码中的VZPlayer *defaultPlayer
是新的,实际上与原始APAPlayer *defaultPlayer
完全分开。 VZPlayer
是代码片段的本地代码,而APAPlayer
是对象的一部分,其他代码可以看到对它的更改。
当您致电self.defaultPlayer
时,您正在使用该属性中的那个。使用没有self
的版本是本地版本。
编辑:
在这种情况下,如果您有多线程代码,self.defaultPlayer
可能会更改。这样做可以确保代码的其余部分仍然在同一个defaultPlayer
上运行,并且不会对原始defaultPlayer
执行某些操作,而将其余内容添加到新代码中{{1}}。这些类型的错误可能导致不一致和意外。的状态。