理解属性赋值

时间:2014-07-02 00:29:50

标签: objective-c properties

我正在通过他们的“冒险”示例使用精灵工具包,并对属性有疑问...... 例如,我们有一个模型

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;
            }
        }
}

2 个答案:

答案 0 :(得分:0)

我看到的唯一区别是他们创建的新实例变量defaultPlayerVZPlayer的实例,而defaultPlayer(APAMultiplayerLayeredCharacterScene的实例变量)是{{的实例1}}。

看起来这可能是一次尝试,但如果是这样,我希望它看起来像这样:

APAPlayer

答案 1 :(得分:0)

在原始代码段中,代码中的VZPlayer *defaultPlayer是新的,实际上与原始APAPlayer *defaultPlayer完全分开。 VZPlayer是代码片段的本地代码,而APAPlayer是对象的一部分,其他代码可以看到对它的更改。

当您致电self.defaultPlayer时,您正在使用该属性中的那个。使用没有self的版本是本地版本。

编辑:

在这种情况下,如果您有多线程代码,self.defaultPlayer可能会更改。这样做可以确保代码的其余部分仍然在同一个defaultPlayer上运行,并且不会对原始defaultPlayer执行某些操作,而将其余内容添加到新代码中{{1}}。这些类型的错误可能导致不一致和意外。的状态。