我无法在此排序方法中找到内存泄漏,启用了ARC。我尝试使用NSDate对象数组准备一个更简单的示例,但那个行为正常。这段代码的问题在哪里?感谢。
- (void)sortDataSourceByDateNewestFirst:(BOOL)newestFirst
{
NSArray *sortedResponseEntities;
NSArray *sortedResponseObjects;
if (newestFirst) {
// sort responseEntities
sortedResponseEntities = [self.responseEntitiesObjects sortedArrayUsingComparator:^NSComparisonResult(ResponsesEntityObject *responseEntity1, ResponsesEntityObject *responseEntity2) {
return [responseEntity2.date compare:responseEntity1.date];
}];
// sort responseObjects
sortedResponseObjects = [self.responsesObjects sortedArrayUsingComparator:^NSComparisonResult(ResponsesObject *response1, ResponsesObject *response2) {
return [response2.dateUp compare:response1.dateUp];
}];
} else {
// sort responseEntities
sortedResponseEntities = [self.responseEntitiesObjects sortedArrayUsingComparator:^NSComparisonResult(ResponsesEntityObject *responseEntity1, ResponsesEntityObject *responseEntity2) {
return [responseEntity1.date compare:responseEntity2.date];
}];
// sort responseObjects
sortedResponseObjects = [self.responsesObjects sortedArrayUsingComparator:^NSComparisonResult(ResponsesObject *response1, ResponsesObject *response2) {
return [response1.dateUp compare:response2.dateUp];
}];
}
self.responseEntitiesObjects = [sortedResponseEntities mutableCopy];
self.responsesObjects = [sortedResponseObjects mutableCopy];
}
编辑,这是Instruments的输出:
答案 0 :(得分:1)
为什么要复制数组而不是简单地将其分配给属性?无论如何,在您发布的代码中没有可见的泄漏,因此案例是:
1)内存尚未被释放,因为设备仍然不需要它,内存被标记为可重用,并将在事件循环的下一次迭代中释放。如果是这种情况,只需将代码包装在autoreleasepool中就可以了:
- (void)sortDataSourceByDateNewestFirst:(BOOL)newestFirst
{
@autoreleasepool {
NSArray *sortedResponseEntities;
NSArray *sortedResponseObjects;
if (newestFirst) {
// sort responseEntities
sortedResponseEntities = [self.responseEntitiesObjects sortedArrayUsingComparator:^NSComparisonResult(ResponsesEntityObject *responseEntity1, ResponsesEntityObject *responseEntity2) {
return [responseEntity2.date compare:responseEntity1.date];
}];
// sort responseObjects
sortedResponseObjects = [self.responsesObjects sortedArrayUsingComparator:^NSComparisonResult(ResponsesObject *response1, ResponsesObject *response2) {
return [response2.dateUp compare:response1.dateUp];
}];
} else {
// sort responseEntities
sortedResponseEntities = [self.responseEntitiesObjects sortedArrayUsingComparator:^NSComparisonResult(ResponsesEntityObject *responseEntity1, ResponsesEntityObject *responseEntity2) {
return [responseEntity1.date compare:responseEntity2.date];
}];
// sort responseObjects
sortedResponseObjects = [self.responsesObjects sortedArrayUsingComparator:^NSComparisonResult(ResponsesObject *response1, ResponsesObject *response2) {
return [response1.dateUp compare:response2.dateUp];
}];
}
self.responseEntitiesObjects = [sortedResponseEntities mutableCopy];
self.responsesObjects = [sortedResponseObjects mutableCopy];
}
}
2)您对数组持有的对象保持强引用。在这种情况下,即使在释放数组之后(当覆盖属性时由ARC自动地),仍然具有保留计数> = 1的所保持的对象不能被释放,因此不释放存储器。如果你不再持有对引用它们的对象的引用,那么你就会泄漏并且对象现在是僵尸(你将通过运行Leaks Instrument来看到它们)。
3)如果持有的对象是自定义对象,那么泄漏就像你采用NSCopying协议一样,在这种情况下你应该发布对象实现(至少是相关的方法)
编辑:刚刚注意到您的属性是NSMutableArray,您可以将其更改为:
- (void)sortDataSourceByDateNewestFirst:(BOOL)newestFirst
{
//@autoreleasepool {
if (newestFirst) {
// sort responseEntities
[self.responseEntitiesObjects sortUsingComparator:^NSComparisonResult(ResponsesEntityObject *responseEntity1, ResponsesEntityObject *responseEntity2) {
return [responseEntity2.date compare:responseEntity1.date];
}];
// sort responseObjects
[self.responsesObjects sortUsingComparator:^NSComparisonResult(ResponsesObject *response1, ResponsesObject *response2) {
return [response2.dateUp compare:response1.dateUp];
}];
} else {
// sort responseEntities
[self.responseEntitiesObjects sortUsingComparator:^NSComparisonResult(ResponsesEntityObject *responseEntity1, ResponsesEntityObject *responseEntity2) {
return [responseEntity1.date compare:responseEntity2.date];
}];
// sort responseObjects
[self.responsesObjects sortUsingComparator:^NSComparisonResult(ResponsesObject *response1, ResponsesObject *response2) {
return [response1.dateUp compare:response2.dateUp];
}];
}
//}
}
通过这种方式,您无需复制数组,只需对现有数组进行重新排序即可。无论如何,这不会解决你的问题,因为正如我所说,这里没有明显的泄漏。
你应该运行仪器来查明泄漏是否和在哪里。