Где утечка? - PullRequest
       21

Где утечка?

0 голосов
/ 08 декабря 2010

Инструменты говорят мне, что в этом куске кода есть утечка. Тем не менее, я уверен, что выпустил его позже. Кто-нибудь может сказать мне, что здесь происходит?

- (void) addReminderEntry{
    DataEntryController* item = [[DataEntryController alloc] initWithEntryType:REMINDER]; // it says that the leak was instantiated here
    item.delegate = self;
    [[self navigationController] pushViewController:item animated:YES];
    [item setEditing:YES animated:YES];
    [item release];// this is the place I release it
}

Спасибо

Ответы [ 3 ]

1 голос
/ 08 декабря 2010

Утечки говорят вам только о том, где была выделена память, но она не может сказать вам, куда поместить код, который должен был ее освободить, чтобы начать с!

Так что это говорит о том, что вы создали контроллер представления, иэто было еще в памяти после того, как ты покончил с этим.Да, вы освобождаете VC в этом коде, но только после того, как представите его - это означает, что контроллер навигации сохранил его и, возможно, другие вещи.Он освобождается только при вызове окончательного выпуска.

Основная причина того, что контроллеры представления не освобождаются, обычно заключается в том, что контроллер представления устанавливает себя в качестве делегата для чего-то, что он сохраняет, и затем не отменяет это, когда представлениеконтроллер выходит за экран.Если ваш контроллер представления является делегатом чего-то, что сохраняет его, он никогда не будет освобожден.

1 голос
/ 08 декабря 2010

Скорее всего, это связано с тем, что не было выпущено в классе DataEntryController.Убедитесь, что вы освобождаете все свои свойства / и т. Д. В этом классе.

0 голосов
/ 19 декабря 2010

Оказывается, это вызвано этим конструктором:

- (DataEntryController*) initWithEntryType:(DataType) eType{
    DataEntryController* item = [[DataEntryController alloc] init];//<- here
    item.entryType = eType;
    item.allowEdit = YES;
    return item;
}

Очевидно, iOS добавляет retain 1 к каждому конструктору с начальным значением init.

Работает нормально после переключения на:

DataEntryController* item = [super init];
...