iOS内存泄漏字典

时间:2012-02-28 08:11:36

标签: objective-c memory-leaks ios4

我是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];
    }
}

2 个答案:

答案 0 :(得分:1)

内存泄漏是由于这一行:

self.liquidProductData = [[NSMutableArray alloc] initWithCapacity:_count];

最有可能的是,该属性标记为retaincopy(通常是前者)。使用它的正确方法是:

self.liquidProductData = [NSMutableArray arrayWithCapacity:_count];

泄漏是因为alloc返回拥有引用,您稍后需要release,但您不会释放它。您现在将其分配给保留实例的属性。 “相对保留计数”现在为+2。如果为此属性分配新值,则旧实例将被释放,但这只会使“相对保留计数”降为+1,因此实例永远不会被释放。这反过来也会泄漏你的字典及其值,因为它们仍然被泄漏的数组保留。

答案 1 :(得分:1)

每次使用方法时,名称的开头都有init,返回的对象永远不会被自动释放,因此您有责任将其释放。

以“type”开头的方法,如“arrayWith”“stringWith”,返回自动释放的对象。

另外,你可以使用静态分析来发现这种泄漏,这很容易。 Xcode static analysis