0

spriteFrameを配置する配列を作成しました。もちろん、使用後に配列を解放しようとしているので、リークは発生しませんが、すべてのコードの下に配置すると、アプリがクラッシュし、アクセスが悪くなります。エラーコード1。これが私がそれをリリースしようとしている方法です:

-(void)moveHair {
    NSMutableArray *animateHair = [NSMutableArray arrayWithCapacity:10];
    for (int i = 1; i < 10; i++) {
        NSString *animHair = [NSString stringWithFormat:@"wRightLong%i.png", i];
        CCSpriteFrame *whiteFrame = [frame spriteFrameByName:animHair];
        [animateHair addObject:whiteFrame];
    }

    CCAnimation *blowHair = [CCAnimation animationWithSpriteFrames:animateHair delay:0.15];
    CCAction *blowingHair = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:blowHair]];
    [white runAction:blowingHair];

    [animateHair release];
    animateHair = nil;
}

なぜそのエラーが発生するのですか?どうすれば修正できますか?

4

2 に答える 2

1

ARC を使用している場合は、retain や release などについて心配する必要はありません。あなたの[animateHair release];

于 2013-02-01T03:46:21.460 に答える
1

最終リリースは必要ありません。次の行を削除します。

[animateHair release];
animateHair = nil;

その理由は、次のように配列を作成したためです。

NSMutableArray *animateHair = [NSMutableArray arrayWithCapacity:10];

そのような場合、NSMutableArrayarrayWithCapacity:メソッドはautoreleasedオブジェクトを返します。

(もう一度解放すると、実際にはCCAnimationオブジェクトによって保持されている配列が解放されます...したがって、次に配列にアクセスしようとすると、指摘したように「Bad Access」例外が発生します。)

ノート:

一般に、NSおよびクラスのほとんどは、クラスの便利な作成メソッドからオブジェクトをUI返します。autoreleased例外は、メソッドに単語neworが含まcreateれている場合です。

代わりに ARC (自動保持カウント) を使用すると、作業が楽になります。ただし、Objective-C の上級開発者になるには、メモリ管理のしくみを学ぶことが重要だと思います。興味のある方は、Ray Wenderlich のサイトのチュートリアルをご覧ください。

http://www.raywenderlich.com/2657/memory-management-in-objective-c-tutorial

于 2013-02-01T03:54:43.893 に答える