我在下面的代码中的某个地方收到了一个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];
}
由于
答案 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上的好人。