Где я здесь сливаю память? Подержанные инструменты - PullRequest
0 голосов
/ 20 января 2012

Instruments сообщает об утечке памяти в этом коде:

- (void)layoutImageMaskViewForImageAtPath:(NSString *)path withFillColor:(UIColor *)color indexPath:(NSIndexPath *)indexPath {
    UIImage *image = [UIImage imageWithContentsOfFile:path];
    [self layoutImageMaskViewForImage:image withFillColor:color indexPath:indexPath];
}

UIColor *anIconFillColor = [UIColor colorWithWhite:0.70 alpha:1.0];
NSIndexPath *anIndexPath = [NSIndexPath indexPathForRow:0 inSection:0];
NSString *aPlaceholderPath = [[NSBundle mainBundle] pathForResource:@"path" ofType:@"png"];
[self layoutImageMaskViewForImage:anImage withFillColor:anIconFillColor indexPath:anIndexPath];

и

NSDictionary *anAssignedData = [aReservationData objectForKey:kAssignedSectionKey];
NSMutableArray *anEmployeeTaskQueueList = [NSMutableArray array];
NSArray *anAssignedReservationData = [anAssignedData objectForKey:kEmployeesIdentifier];

for (NSDictionary *aJobQueueData in anAssignedReservationData) {
    EmployeeReservationQueue *anAssignedTaskQueue = [[EmployeeReservationQueue alloc] initWithServerDictionary:aJobQueueData];

    if (anAssignedTaskQueue.rows.count == 0) {
        ReservationTrack *aTrack = [[ReservationTrack alloc] init];
        aTrack.rowSortOrder = 0;
        aTrack.reservations = [NSArray array];
        anAssignedTaskQueue.rows = [NSArray arrayWithObject:aTrack];
        [aTrack release];
    }

    [anEmployeeTaskQueueList addObject:anAssignedTaskQueue];
    [anAssignedTaskQueue release];
}

Ответы [ 4 ]

1 голос
/ 20 января 2012

Во втором случае здесь:

[aTrack release];

Что такое aTrack?Может быть, вы имеете в виду [track release];?

В первом случае, вероятно, вы переходите к функциям, не являющимся автоматически выпущенными параметрами, или же вы не отпускаете их после вызова этого метода.Просто отправьте код, где вы вызываете этот метод, и я проверю.

1 голос
/ 20 января 2012

Золотое правило управления памятью в Objective-C:
Каждый 'init', 'copy', 'mutableCopy', 'retain' должен вызывать затем 'release' или 'autorelease'.

1 голос
/ 20 января 2012

Ваш второй пример пропускает track.Ваша последняя строка выпускает aTrack вместо.

0 голосов
/ 21 января 2012

Instruments сообщает, что в вашем приложении есть объект ReservationTrack. По умолчанию он показывает, где был размещен утечку объекта, то есть код, который вы опубликовали. Код, который вы разместили, не пропускает ReservationTrack. Он хранит его в EmployeeReservationQueue, который хранится в NSMutableArray. Одна из возможностей заключается в том, что вы позже получите доступ к объекту ReservationTrack, отправите его retain и не отправите release или autorelease. Другая возможность - утечка EmployeeReservationQueue или NSMutableArray.

Если вы используете симулятор, вы можете увидеть полную историю сохранения / выпуска большинства объектов. При обнаружении просочившегося объекта наведите курсор мыши на адрес объекта и щелкните стрелку вправо, которая появляется рядом с адресом. Инструменты будут показывать вам каждое событие malloc, retain, release и autorelease для этого объекта. Если вы выберете View> Extended Detail в строке меню, вы можете щелкнуть любое из этих событий и увидеть трассировку стека этого события. Это должно помочь вам отследить несбалансированный retain.

...