我有一个问题,希望有人能回答。我是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类就可以与原始数组及其包含的对象进行交互。
非常感谢你的帮助!
答案 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];