0

我有个问题希望有人能回答。我是 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”类中也是如此。

我还应该提到我真的不想传递数组的副本,而是传递指针或引用,以便我的捕获类可以与原始数组及其包含的对象进行交互。

非常感谢你的帮助!

4

1 回答 1

2

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

#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];
于 2012-05-23T22:28:32.277 回答