尝试释放NSMutableArray时获取错误的访问错误代码1

时间:2013-02-01 03:42:46

标签: objective-c cocos2d-iphone

我已经创建了一个数组来放入我的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;
}

为什么我会收到该错误,如何解决?

2 个答案:

答案 0 :(得分:1)

如果您使用ARC,则无需担心保留和释放等问题。删除[animateHair release];

答案 1 :(得分:1)

您不需要最终版本。删除这些行:

[animateHair release];
animateHair = nil;

原因是您创建了这样的数组:

NSMutableArray *animateHair = [NSMutableArray arrayWithCapacity:10];

在这种情况下,NSMutableArray的{​​{1}}方法会返回arrayWithCapacity:个对象。

(通过再次释放它,你实际上是通过autoreleased对象释放保留的数组...因此,下次它尝试访问数组时,你会收到“Bad Access”异常。)

注意:

通常,大多数CCAnimationNS类从类便捷创建方法返回UI个对象。例外情况是该方法中包含单词autoreleasednew

您可以使用ARC(自动保留计数)来改善您的生活。但是,在我看来,了解内存管理的工作原理对于成为Objective-C的高级开发人员非常重要。以下是Ray Wenderlich网站的教程,如果您有兴趣:

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