我找不到这个内存泄漏。我以为我正在正确释放一切

时间:2011-02-16 04:12:05

标签: objective-c debugging ios memory-leaks

我找不到这个内存泄漏。我以为我一直在正确地释放东西。这是有问题的代码块。

 - (void) createProvince:(NSString *) provinceName {

    // if province does not exist create it
    if ([self hasProvince: provinceName] == NO) {

        // get the province object
        NSPredicate *predicate;
        predicate = [NSPredicate predicateWithFormat:@"Name == %@", provinceName];

        NSMutableArray *provArray = [[NSMutableArray alloc] init];
        [provArray setArray: [CoreDataHelper searchObjectsInContext:@"Province" :predicate :@"Name" :YES :[self managedObjectContext]]];

        NSIndexPath *indexPath;
        indexPath = [NSIndexPath indexPathForRow:0 inSection: 0];

        [[self provinces] addObject: [provArray objectAtIndex: [indexPath row]]];
        [provArray release];

        // create a cities array to hold its selected cities
        NSMutableArray *array = [[NSMutableArray alloc] init];
        [[self cities] addObject: array];
        [array release];
    }
}

漏洞在这里:

[[self provinces] addObject: [provArray objectAtIndex: [indexPath row]]];

NSMutableArray *array = [[NSMutableArray alloc] init];
[[self cities] addObject: array];

我正在创建局部变量,通过适当的setter将它们分配给我的实例变量,然后释放局部变量。我不确定发生了什么。

2 个答案:

答案 0 :(得分:2)

你有dealloc方法正确释放所有内容吗?

请注意,泄漏会显示您分配内容的位置。它没有告诉你它实际泄漏的地方;保留没有明确平衡。

答案 1 :(得分:2)

让我们来看看:

NSMutableArray *array = [[NSMutableArray alloc] init];
[[self cities] addObject: array];
[array release];

当你alloc一个对象时,它的保留计数设置为1:

NSMutableArray *array = [[NSMutableArray alloc] init]; # retain count of array is 1

将对象添加到NSMutableArray时,该对象的retain计数会递增:

[[self cities] addObject: array]; # retain count of array is 2

当您release array时,其保留计数会递减:

[array release]; # retain count is now 1

一旦你的方法结束,你仍然拥有可变数组[self cities]拥有的那个数组。

因为[self cities]似乎没有被释放或清空,所以这就是泄漏的地方。

您需要在某个时刻清空或释放可变数组,释放其中包含的对象。如果cities是一个类属性,那么在释放类时可能会release

修改

修正了init - alloc错误。