这种方法中的内存泄漏在哪里?

时间:2014-04-28 15:34:19

标签: ios objective-c

我无法在此排序方法中找到内存泄漏,启用了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的输出:

enter image description here

1 个答案:

答案 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];
            }];
        }
    //}
}

通过这种方式,您无需复制数组,只需对现有数组进行重新排序即可。无论如何,这不会解决你的问题,因为正如我所说,这里没有明显的泄漏。

你应该运行仪器来查明泄漏是否和在哪里。

相关问题