0

質問があります。誰かが答えてくれることを願っています。私は Objective C を初めて使用します。ほとんどの場合、問題はほとんどありませんが、クラス間で NSMutableArray を適切に渡す方法を理解していないことが明らかになりました。関連するコードは次のとおりです。

これは、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 に答える