我是iOS编程的新手,我为我的客户开发了一个应用程序。但是,当我使用Instruments运行应用程序时,似乎存在由字典引起的内存泄漏问题,但如果我发布它,则应用程序崩溃。我不确定是什么问题。
这是乐器的图像:http://www.flickr.com/photos/71234685@N02/6791493522/in/photostream/
-(void) generateLiquidProductData:(NSArray*) liquidProduct {
int _count = 52;
self.liquidProductData = [[NSMutableArray alloc] initWithCapacity:_count];
for (int i = 0; i < _count; i++){
float x = i;
float y;
if ((liquidProduct != (id)[NSNull null]) && (liquidProduct != nil) && ([liquidProduct count] != 0)) {
y = [[liquidProduct objectAtIndex:i] floatValue];
y = round(y * 10000.0f) / 10000.0f;
}
else {
y = 0.0;
y = round(y * 10000.0f) / 10000.0f;
}
NSDictionary* _gotLiquidProduct = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithDouble:x],X_VAL,
[NSNumber numberWithDouble:y],Y_VAL,
nil];
NSLog(@"This is y %.5f", y);
[self.liquidProductData addObject:_gotLiquidProduct];
}
}
答案 0 :(得分:1)
内存泄漏是由于这一行:
self.liquidProductData = [[NSMutableArray alloc] initWithCapacity:_count];
最有可能的是,该属性标记为retain
或copy
(通常是前者)。使用它的正确方法是:
self.liquidProductData = [NSMutableArray arrayWithCapacity:_count];
泄漏是因为alloc
返回拥有引用,您稍后需要release
,但您不会释放它。您现在将其分配给保留实例的属性。 “相对保留计数”现在为+2。如果为此属性分配新值,则旧实例将被释放,但这只会使“相对保留计数”降为+1,因此实例永远不会被释放。这反过来也会泄漏你的字典及其值,因为它们仍然被泄漏的数组保留。
答案 1 :(得分:1)
每次使用方法时,名称的开头都有init,返回的对象永远不会被自动释放,因此您有责任将其释放。
以“type”开头的方法,如“arrayWith”“stringWith”,返回自动释放的对象。
另外,你可以使用静态分析来发现这种泄漏,这很容易。 Xcode static analysis