NSArray内存管理

aza*_*arp 0 iphone

出于某种原因,当我发布NSArray时,我得到了EXC_BAD_ACCESS异常.这是实施:

-(void) loadAllAlphabets
{
    NSBundle *bundle = [NSBundle mainBundle]; 
    NSArray *imagesPath = [[NSArray alloc] init]; 

    imagesPath = [bundle pathsForResourcesOfType:@"png" inDirectory:@"Images"];

    alphabets = [[NSMutableArray alloc] init]; 

    NSString *fileName = [[NSString alloc] init]; 

    for(int i=0; i<= imagesPath.count -1 ; i++) 
    {
        fileName = [[imagesPath objectAtIndex:i] lastPathComponent];
        CCSprite *sprite = [CCSprite spriteWithFile:fileName];

        sprite.userData = [[fileName stringByDeletingPathExtension] uppercaseString];   

        [alphabets addObject:sprite]; 
    }

    // release fileName 
    [fileName release]; 
    fileName = nil; 

    [imagesPath release]; // this causes the application to crash with EXC_BAD_ACCESS
//  imagesPath = nil; 
Run Code Online (Sandbox Code Playgroud)

}

更新1:

所以,问题是虽然我负责释放imagesPath对象,因为我使用了alloc,当pathsForResourcesOfType返回一个autorelease对象时很快变得无关紧要.这意味着我不应该手动释放imagesPath对象.

应使用以下行:

NSArray *imagesPath = [bundle pathsForResourcesOfType:@"png" inDirectory:@"Images"];
Run Code Online (Sandbox Code Playgroud)

更新2:

另一个与这篇文章有关的问题.在下面的代码中,我手动初始化一个新的NSMutableArray.

alphabets = [[NSMutableArray alloc] init]; 
Run Code Online (Sandbox Code Playgroud)

后来我将CCSprite(Cocos2d对象)插入到字母数组中.CCSprite是自动释放对象.我还需要手动发布字母吗?因为,经过一段时间后所有对象都被释放并且内存将被返回但是那么字母表中的NSMutable数组会留下什么?

Ste*_*ton 6

我认为混乱在这里:

NSArray *imagesPath = [[NSArray alloc] init]; 
imagesPath = [bundle pathsForResourcesOfType:@"png" inDirectory:@"Images"];
Run Code Online (Sandbox Code Playgroud)

第一行创建一个新对象.这个对象确实需要发布.

第二行使用新的自我管理对象覆盖该对象.但这并不需要手动释放.

这意味着您正在泄漏第一个imagesPath.

通常,如果您alloccopy它需要释放对象.在释放(或自动释放)其内容之前,不应该覆盖对象.


Vla*_*mir 5

内存管理的一般经验法则 - 仅当使用包含 new、copy 或 alloc 的方法获取对象时才应该释放该对象(标准方法遵循该规则,您也应该遵守它)。

在您的情况下,您使用pathsForResourcesOfType:返回自动释放对象的方法获取 imagesPath 对象,因此您不能自己释放它。

编辑:是的,您需要alphabets在某处释放对象(出于同样的原因 - 您通过 alloc 方法获得它)。

Objective-c 容器拥有添加到其中的对象的所有权,即当将对象添加到数组时,它们会被保留,因此保证它们的生命周期至少与容器的生命周期一样长。当您从集合中删除对象或集合本身被销毁时,其成员将被释放(以补偿添加时的保留)。