0

我已经创建了一个数组来将我的 spriteFrame 放入其中,当然,我试图在使用它之后释放该数组,这样它就不会泄漏,但是每当我将它放在我的所有代码下面时,我的应用程序就会崩溃并且我得到 Bad Access错误代码 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,则无需担心诸如保留和释放之类的事情。删除您的[animateHair release];

于 2013-02-01T03:46:21.460 回答
1

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

[animateHair release];
animateHair = nil;

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

NSMutableArray *animateHair = [NSMutableArray arrayWithCapacity:10];

在这种情况下,NSMutableArray'arrayWithCapacity:方法返回一个autoreleased对象。

(通过再次释放它,您实际上是通过您的CCAnimation对象释放保留的数组......因此,下次它尝试访问该数组时,您会得到如您所述的“错误访问”异常。)

笔记:

通常,大多数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 回答