当我调用一个返回字符串的方法时,我有内存泄漏---- 方法定义如下
-(NSMutableArray *)read
{
NSMutableArray *dataArray = [[NSMutableArray alloc] init];
//picking data from database here
return dataArray;
}
这表明内存泄漏很大
我也试过--- NSMutableArray *dataArray = [[[NSMutableArray alloc] init]autorelease];
但这次泄漏检查过程被绞死
我也无法在返回之前释放该数组
请帮助
答案 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输出。