Утечка памяти при сортировке массива - PullRequest
2 голосов
/ 10 февраля 2012

У меня есть следующая функция

- (NSArray *) getUsers : (days) aDay {

    NSArray *arr = [[[NSArray alloc] init] autorelease];

    for (User *e in [week objectAtIndex:aDay]) {
        //Get distance to user
        e.place.distance = [[LocationManager sharedLocationManager] getDistanceWithLat:e.place.latitude Lon:e.place.longitude];
    }

    //Sort the array
    arr = [ [week objectAtIndex:aDay] sortedArrayUsingComparator:^(id obj1, id obj2){
            User *e1 = (User *)obj1;
            User *e2 = (User *)obj2;

            if (e1.place.distance <= e2.place.distance) {
                return (NSComparisonResult)NSOrderedAscending;
            } else {
                return (NSComparisonResult)NSOrderedDescending;
            }
        return (NSComparisonResult)NSOrderedSame;
    }];

    [arr retain];

    return arr;
}

Утечка, и я не могу понять, как это исправить. Если я удаляю [arr retian], то происходит сбой приложения.

Когда я предварительно формирую профиль действия, на этой строке инструментов отображается утечка 100%:

   arr = [ [week objectAtIndex:aDay] sortedArrayUsingComparator:^(id obj1, id obj2){

Как я могу исправить эту утечку?

Ответы [ 2 ]

2 голосов
/ 10 февраля 2012

Удалить NSArray *arr = [[[NSArray alloc] init] autorelease]; и [arr retain]; вообще. В первой строке вы выделили память, но при сортировке обращаетесь к новому массиву и получаете утечку.

NSArray *arr = [ [week objectAtIndex:aDay] sortedArrayUsingComparator:^(id obj1, id obj2){
            User *e1 = (User *)obj1;
            User *e2 = (User *)obj2;

            if (e1.place.distance <= e2.place.distance) {
                return (NSComparisonResult)NSOrderedAscending;
            } else {
                return (NSComparisonResult)NSOrderedDescending;
            }
        return (NSComparisonResult)NSOrderedSame;
    }];

return arr;
0 голосов
/ 10 февраля 2012

Вы возвращаете оставленный объект: arr.Методы, возвращающие, сохраняют объекты. Правила именования Objective-C просто начинаются с new или содержат слово copy.

Нет необходимости выделять / init arr, метод sortedArrayUsingComparator вернетautoreleased NSArray.

Не называйте метод с префиксом "get", если они не возвращают результаты через ссылочный параметр.Это основные правила именования Objective C, и ARC полагается на соблюдение правил именования.

См. Документацию Apple Введение в рекомендации по кодированию для какао

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...