2

NSMutableArray に CCSprites を設定し、それらをシーンに追加された現在のレイヤーに追加しています。配列の要素にアクセスしようとすると、不正なアクセス エラーが発生します。

sprites = [[[NSMutableArray alloc] init]autorelease];

    int j = 0;

    for (int i=0; i<[sprites count]; i++)
    {
        j=i+1;
        sprite = [CCSprite spriteWithFile:[NSString stringWithFormat:@"intro%d.png",j]];
        sprite.position = ccp(WIDTH/2, HEIGHT/2+(i*HEIGHT));
        [sprites addObject:sprite];

    }

    for (int i = 0; i<[sprites count]; i++)
    {
        [self addChild:[sprites objectAtIndex:i]];
    }


    [self scheduleUpdate];


}
return self;

これは init メソッドで行われ、スプライトとスプライトはヘッダー ファイルで宣言されます。updateメソッドの中に、私は持っています

sprite = [sprites objectAtIndex:1];
sprite.position = ccpAdd(sprite.position, ccp(0,dy));
CCSprite* spr = [sprites objectAtIndex:2];
spr.position = ccpAdd(spr.position, ccp(0,dy));

update メソッドに制御が渡されると、不正なアクセスが発生します。誰かが私を助けてくれたら嬉しいです

4

3 に答える 3

0

これは、autorelease オブジェクトを作成し、後で更新コードでアクセスしようとしたために発生しています。スプライト配列の保持カウントはゼロであり (自動解放であるため)、割り当てが解除され、アクセスしようとすると、不正なアクセス エラーが発生します。

修正するには、スプライト配列を自動解放オブジェクトにしないでください。後でコードでオブジェクトを使用する予定があるため、(autorelease を追加せずに) 保持しておく必要があります。また、(配列で動作している親オブジェクトが何であれ) の dealloc メソッドで配列を解放することも確認する必要があります。

- ( void ) dealloc {
   [ sprites release ];
   [ super dealloc ];
}
于 2013-04-02T21:36:00.450 に答える
0

他の人は正しいです (autorelease呼び出しが原因です。呼び出しを削除してからdealloc、シーンのメソッドで配列を解放する必要があります)。

[[[NSMutableArray alloc] init]autorelease]また、同じ効果があることに注意して[NSMutableArray array]ください(ただし、シナリオでは、これは必要なものではありません)。

于 2013-04-03T03:59:15.437 に答える