CCSprite不会将自己添加到NSArray中

时间:2013-05-24 19:20:43

标签: ios objective-c cocos2d-iphone nsmutablearray

我正在尝试将CCSprite添加到数组中,以便我可以使用其他方法执行操作。该数组只是在@interface中简单地声明为NSMutableArray *currentBombs; 。然后,我尝试使用(CCSprite*)sprite

[currentBombs addObject:sprite];添加到数组中

问题在于,当我记录[currentBombs count]或尝试使用其中的任何对象或记录它或其他任何对象时,它是空的。由于CCSprite是NSObject的子类,我认为你可以将它添加到数组中吗?我在这做错了什么?

编辑:更详细的代码:

-(void)aMethod:(CCSprite*)Sprite{
//...
    currentBombs = [[NSMutableArray alloc]init];
    [currentBombs addObject:sprite];
}

然后我在方法

后一秒钟访问它
-(void)checkDamageForBomb{
currentBombs = [[NSMutableArray alloc]init];
int cB = [currentBombs count];

for (int q = 0; q <= cB;q++)
{   
    CCSprite *bomb = [currentBombs objectAtIndex:q];//Crashes
    CGPoint bombPos = [self tileCoordForPosition:bomb.position];//Crashes 

//........ }

2 个答案:

答案 0 :(得分:1)

这是因为每次调用checkDamageForBomb时都会发生这种情况:重新分配数组。您应该只将对象实例化一次。

我建议使用具有延迟初始化的属性,并始终调用 self.currentBombs

@interface MyClass()

@property (nonatomic) NSMutableArray* currentBombs;

@end

@implementation MyClass

#pragma mark - Accessors

- (NSMutableArray*) currentBombs
{
    if(!_currentBombs)
        _currentBombs=[NSMutableArray array];
    return _currentBombs;
}

这样您就必须更改代码并始终调用 self.currentBombs

-(void)checkDamageForBomb{

    for(CCSprite* bomb in self.currentBombs)  // I find fast enumeration more elegant.
    {
        CGPoint bombPos = [self tileCoordForPosition:bomb.position];
        ...
    }
    ...
}

因此,您无需分配它,访问者将在您第一次调用它时为您执行此操作。

答案 1 :(得分:0)

您正在初始化变量currentBombs两次。在例如初始化一次viewDidLoad中