iphone中的内存泄漏情况

时间:2010-11-20 07:50:31

标签: iphone objective-c memory-leaks

当我调用一个返回字符串的方法时,我有内存泄漏---- 方法定义如下

-(NSMutableArray *)read
{
NSMutableArray  *dataArray = [[NSMutableArray alloc] init];

//picking data from database here


return dataArray;
}
这表明内存泄漏很大 我也试过--- NSMutableArray *dataArray = [[[NSMutableArray alloc] init]autorelease];

但这次泄漏检查过程被绞死

我也无法在返回之前释放该数组

请帮助

3 个答案:

答案 0 :(得分:3)

-(NSMutableArray *)read
{
    NSMutableArray  *dataArray = [[NSMutableArray alloc] init];

    //picking data from database here

    return dataArray;
}

任何使用方法read的东西都会期望找回它不拥有的对象。但是,正如这里所写,dataArray仍然在返回点拥有。你无法释放它,因为这可能会让它完全消失。在这种情况下,您必须自动释放阵列。你可以这样做:

-(NSMutableArray *)read
{
    NSMutableArray  *dataArray = [[[NSMutableArray alloc] init] autorelease];

    //picking data from database here

    return dataArray;
}

或者

-(NSMutableArray *)read
{
    NSMutableArray  *dataArray = [[NSMutableArray alloc] init];

    //picking data from database here

    return [dataArray autorelease];
}

你说“泄漏检查过程被绞死”但我真的不确定你的意思。无论是挂起,崩溃还是播放博茨瓦纳国歌,你都需要自动释放返回的阵列,其他任何问题实际上都是一个不同的问题。可能,您忘记将数据保留在其他位置。

答案 1 :(得分:1)

另一个答案更多...... 在cocoa / cocoa-touch中有许多约定,其中one表示如果方法具有前缀init,那么您将拥有该对象的所有权(因此您必须释放它) )

这不是你的情况,因此如果你这样做:

DatabaseReader *dbReader = [[DatabaseReader alloc] init];
NSMutableArray *mutArray = [dbReader read];
[dbReader release];

你不应该释放mutArray。但是,创建的对象是由某人发布的。所以你可以像JeremyP写的那样做。 alloc / init并将其放入read方法实现中的自动释放池中。或者,您可以这样做:

-(NSMutableArray *)read
{
    NSMutableArray  *dataArray = [NSMutableArray array];
    //IMPORTANT:
    //Did you noticed that I am not using any method 
    //with init prefix for the creation of dataArray ? 
    //so I don't need to release by my self ;)

    //picking data from database here

    return dataArray;
}

基本相同。 ;)

答案 2 :(得分:-1)

返回对象的所有权可能会返回给从此函数接收的对象。您可以使用类似的东西对对象的保留计数进行一些调试......

NSLog(@"Retain count: %i", [dataArray retainCount]);

打开调试控制台(Xcode中的Command + R)以查看NSLog输出。