在类之间传递NSMutableArray

时间:2012-05-23 22:07:56

标签: objective-c cocos2d-iphone nsmutablearray pass-by-reference

我有一个问题,希望有人能回答。我是Objective C的新手,虽然它大部分都给我带来了一些麻烦,但很明显我不明白在类之间正确传递NSMutableArrays。以下是相关代码:

这是我想要捕获NSMutableArray的类

#import "CanBee.h"
#import "Rat.h"
@implementation CanBee
-(id) init
{
    if ((self = [super init])) {
        if([[self parent] respondsToSelector:@selector(getRatsArray)] == YES)
        {
            ratsArray = (NSMutableArray *) [[self parent] performSelector:@selector(getRatsArray)];
        }
        [self scheduleUpdate];
    }
    return self;
}


-(void) update:(ccTime)delta
{
    for (int i = 0; i <= ratsArray.count; i++) {
        NSLog(@"in rats array loop in canBee: %i",i);
        Rat * rat = [ratsArray objectAtIndex:i];
        if (abs(self.position.x - rat.position.x) < 10 && abs(self.position.y - rat.position.y) < 10) {
            [[self parent] removeChild: rat cleanup:TRUE]; //<-- this line is probably not correct, but not relevant to my question anyway, don't worry about it for this post
        }
    }
}

@end

这是来自gameLayer类的init函数,我的游戏的主控制器类

    ratsArray = [NSMutableArray alloc];

    Rat * rat = [Rat spriteWithFile:@"rat.png"];
    [rat setPosition:ccp((4 * 53) - 25,100)];
    [rat setScale:.75];
    [self addChild:rat z:6];

    [ratsArray addObject:rat]; 

这是同一控制器类中的getter函数

-(NSMutableArray *) getRatsArray {
    return ratsArray;
}

我应该提一下,ratsArray是控制器类中的一个全局变量,也是捕获器“CanBee”类中的全局变量。

我还应该提一下我真的不想传递数组的副本,而是传递一个指针或引用,这样我的catch类就可以与原始数组及其包含的对象进行交互。

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:2)

我只想添加一个init的替代实现,它将ratsArray作为参数,并确保给该方法一个有意义的名称。这样,您不需要代码行就可以从控制器获取它。它看起来像这样:

#import "CanBee.h"
#import "Rat.h"
@implementation CanBee
-(id) init
{
    if ((self = [super init])) {
    }
    return self;
}

-(id) initWithRatsArray:(NSMutableArray *)ratsArray 
{
    if ((self = [super init])) {
        ratsArray = ratsArray;
        //don't forget about proper memory management here
        [ratsArray retain]
        [self scheduleUpdate];
    }
    return self;
}

然后,当您实例化CanBee类时,将ratsArray作为参数传递,如:

CanBee *aCanBee = [[CanBee alloc] initWithRatsArray:ratsArray];