我在这个Objective-c方法中有内存泄漏,谁能告诉我在哪里?

时间:2012-03-01 08:59:10

标签: objective-c ios memory memory-management exc-bad-access

我在下面的代码中的某个地方收到了一个exc_bad_access。如果有人能发光,我不明白它在哪里?它是一个接收字典的NSMutableArray并通过字典中的一个元素对它们进行排序的方法。内存泄漏几乎肯定与块有关,但我认为我找不到找到它的基本内容......

-(NSMutableArray*)sortBicyclesByDistanceToDevice:(NSMutableArray*)inputArray{

    NSArray *arrayToHoldSorted = [[[NSArray alloc] init];

    arrayToHoldSorted = [inputArray sortedArrayUsingComparator:^(id a, id b){

        NSNumber *first = [[a objectForKey:kDistanceFromDevice] objectForKey:kValue];
        NSNumber *second = [[b objectForKey:kDistanceFromDevice] objectForKey:kValue];
        return [first compare:second];}];


    NSMutableArray *retVal = [[NSMutableArray alloc] init];

    retVal = [arrayToHoldSorted mutableCopy];

    [arrayToHoldSorted release];

    return [retVal autorelease];
}

由于

5 个答案:

答案 0 :(得分:3)

看起来您将retVal分配给NSMutableArray,然后立即重新分配。原始分配的NSMutableArray将泄露。那就是:

NSMutableArray *retVal = [[NSMutableArray alloc] init];
retVal = [arrayToHoldSorted mutableCopy];

应该是:

NSMutableArray *retVal = [arrayToHoldSorted mutableCopy];

答案 1 :(得分:2)

替换:

NSMutableArray *retVal = [[NSMutableArray alloc] init];
retVal = [arrayToHoldSorted mutableCopy];

使用:

NSMutableArray *retVal = [arrayToHoldSorted mutableCopy];

您正在泄露retVal的第一个值。

答案 2 :(得分:2)

那里有不止一个!

这一行:

NSArray *arrayToHoldSorted = [[[NSArray alloc] init];

由于您立即重新分配指针,因此是内存泄漏。它应该删除。只需在下一行声明您的数组:

NSArray* arrayToHoldSorted = [inputArray sortedArrayUsingComparator...

此方法返回一个自动释放的对象,因此您不需要稍后释放它。

与可变数组类似的模式。你分配/ init,然后用一个新对象覆盖,给另一个泄漏。再次,删除alloc / init行,并在下一行中声明。 mutableCopy为您提供了一个隐式保留的对象,因此您需要自动释放它。

您似乎认为每次声明对象变量时都需要alloc / init。不是这种情况。

答案 3 :(得分:1)

您分配了arrayToHoldSorted(1) - 您从未使用过,然后从sortedArrayUsingComparator(2)返回NSArray。然后你在没有拥有它之后释放它(3)。你为retVal做了同样的技巧,分配一个NSMutableArray - 然后通过从[arrayToHoldSorted mutableCopy]中获取一个新的NSMutableArray来覆盖你对它的引用;

NSArray *arrayToHoldSorted = [[NSArray alloc] init]; .. // 1

arrayToHoldSorted = [inputArray sortedArrayUsingComparator:^(id a, id b) ..... // 2

[arrayToHoldSorted release]; // 3

只需将来自sortedArrayUsingComparator的返回NSArray分配给引用...

NSArray* arrayToHoldSorted = [inputArray sortedArrayUsingComparator:^(id a, id b) .....

答案 4 :(得分:1)

我认为问题在于这一行:

返回[retVal autorelease];

你发布了一些你没有保留过的东西。也在这一行:

NSArray * arrayToHoldSorted = [[[NSArray alloc] init];

你有一个额外的[,这没有帮助。但最重要的是,您可以使用XCode中的静态分析器来诊断这类错误,而不是纠缠StackOverflow上的好人。