Ios CCSprite userObject具有意外的空值(cocos2d 3.2)

Ios CCSprite userObject具有意外的空值(cocos2d 3.2),ios,objective-c,cocos2d-iphone,Ios,Objective C,Cocos2d Iphone,我试图将NSNumber对象保存为CCSprite的userObject属性,但由于我无法理解的原因,该值正在更改为null。CCSprite是在init方法中为我的自定义CCNode创建的: @implementation MainScene { NSMutableArray *sprites; NSArray *imageFileNames; } -(id) init { self = [super init]; if (self) { i

我试图将NSNumber对象保存为CCSprite的userObject属性,但由于我无法理解的原因,该值正在更改为null。CCSprite是在init方法中为我的自定义CCNode创建的:

@implementation MainScene {
    NSMutableArray *sprites;
    NSArray *imageFileNames;
}

-(id) init {
    self = [super init];
    if (self) {

        int spriteCount = 9;

        imageFileNames = @[@"ccbResources/clubs.png", @"ccbResources/cog.png", @"ccbResources/diamonds.png", @"ccbResources/dice.png", @"ccbResources/droplet.png", @"ccbResources/heart.png", @"ccbResources/pacman.png", @"ccbResources/pawn.png", @"ccbResources/spades.png"];

        sprites = [NSMutableArray arrayWithCapacity:spriteCount];

        for (int i = 0; i < spriteCount; i++) {            
            CCSprite *sprite = [CCSprite spriteWithImageNamed:imageFileNames[i%imageFileNames.count]];
            [self addChild:sprite];
            sprite.scale = 1.8f;
            sprite.position = ccp(xPos, yPos);
            sprite.color = [CCColor colorWithRed:arc4random_uniform(255)/255.0f green:arc4random_uniform(255)/255.0f blue:arc4random_uniform(255)/255.0f];
            sprite.userObject = [NSNumber numberWithInt:i];

            [sprites addObject:sprite];

            CCLog(@"%@", sprite.userObject); // outputs the value of i, as intended
        }

    }
    return self;
}

我不明白为什么第一次调用update时sprite.userObject的值总是空的,直到在update方法中为其分配了一个新的NSNumber之后才保持空。这尤其令人困惑,因为sprite.userObject在init方法中为其分配了一个有效的NSNumber,并且该值在更新方法内部以外的任何位置都不会更改甚至读取。

Odd。尝试将精灵本身分配给userObject,以查看这是否会更改第一次更新行为。如果是,请检查userObject是否声明为弱属性。如果是这样,那就应该改变。另一件要尝试的事情是循环更新中的self.children,而不是sprites数组,以查看这是否有任何区别,然后比较它们的指针值,以确保它们是相同的sprite实例。@LearnCos2D我仔细检查了您的建议,发现应用程序的行为没有差异。值在init中设置正确,但在update中设置为null,并检查userObject是否确实是强属性。因此,我在-[CCNode setUserObject:]上设置了一个符号断点,并发现正在调用-[CCBReader cleanUpNodeGraph:],这就是userObject属性显式设置为null的地方。有趣的是,在这种情况下,将init代码移动到修复它的didLoadFromCCBYes。SpriteBuilder应该真正自动将实现(可能是注释掉的实现)添加到它创建的节点的源文件中。我没有意识到这一点,因为我以前没有使用过SpriteBuilder,现在才开始使用它,因为它是cocos2d项目的首选工作流。
-(void) update:(CCTime)delta {
    for (CCSprite *sprite in sprites) {
        CCLog(@"%@", sprite.userObject);
        // outputs "(null)" on the first update,
        // and outputs the value of newSpriteType on subsequent updates

        int newSpriteType = arc4random_uniform( (u_int32_t)imageFileNames.count );
        sprite.userObject = [NSNumber numberWithInt:newSpriteType];
    }
}