Большое количество сохранений для недавно созданного объекта. Objective-C - PullRequest
0 голосов
/ 25 января 2012

Я получаю странный случай чрезмерного количества операций сохранения для контроллера представления, который загружается при нажатии кнопки.

Это код:

-(IBAction)new
{
    if (!viewSpace)
        viewSpace = [[ViewSpace alloc] initWithNibName:@"ViewSpace" bundle:nil];

    viewSpace.delegate = self;

    viewSpace.view.frame = CGRectMake(0, 0, viewSpace.view.frame.size.width, viewSpace.view.frame.size.height);

    [self presentModalViewController:viewSpace animated:YES];

    NSLog(@"Count Retain: %d",[viewSpace retainCount]);

}
-(void)viewSpaceWasDissmissed:(id)sender
{
    [self dismissModalViewControllerAnimated:YES];
    [viewSpace release];    
    NSLog(@"Count Retain: %d",[viewSpace retainCount]);
}

КогдаIBAction New выполняется в первый раз, счет сохранения равен 5, когда только что создан.(Должно быть 1).

Когда объект ViewSpace должен быть выгружен, вызывается функция viewSpaceWasDismissed, чтобы удалить модальное представление и освободить предыдущий объект.

Проблема заключается в том, что никогда не сохраняется счетдостичь 0, и метод dealloc в ViewSpace никогда не вызывается, вызывая утечки памяти.

Мой вопрос: как возможно, что недавно созданный ViewController имеет 5 сохранений?Я убедился, что это никогда не было создано.

Спасибо.

Ответы [ 4 ]

4 голосов
/ 25 января 2012

Какао, вероятно, сохраняет контроллер представления 4 раза внутри по собственным причинам.Это не проблема.

В целом, метод -retainCount бесполезен по подобным причинам, и вы никогда не должны вызывать его.Это вам не поможет, и вас смущает.

Чтобы устранить утечку, я предлагаю использовать Инструмент утечки, осмотреть объект и проанализировать, откуда поступают каждое удержание и выпуск, чтобы определить, являются ли какие-либо ошибки неверными..

3 голосов
/ 25 января 2012

Вы делаете две вещи неправильно здесь:

  1. Текущий контроллер представления сохраняет модально представленный контроллер представления и освобождает его, когда он отклоняется. Поэтому вы должны выпустить viewSpace после его представления, и вам не нужно сообщение о выпуске в методе dismissModalViewController. Кроме того, ViewSpace - плохое имя для контроллера представления. Мне пришлось прочитать строку, где вы представляете его как контроллер представления, прежде чем я понял, что это контроллер представления. Я думаю ViewSpaceController это более описательное имя.
  2. Вы используете retainCount, что всегда является плохой идеей. Все, что имеет значение, это то, что в вашем методе new вы создали собственный объект (с alloc) и вы уравновешивали это право собственности с выпуском (или, по крайней мере, вы это сделаете, когда внесете исправление, предложенное в пункте 1) Вот и все. Вы вступили во владение объектом и выпустили его. Метод retainCount не говорит вам абсолютно ничего, что может быть вам полезно. Не делай этого. Просто соблюдайте баланс между собственностью и релизом, и это все, что имеет значение.
3 голосов
/ 25 января 2012

Проверьте документацию для -retainCount. Я полагаю, это говорит о том, что вам не следует называть это самостоятельно - вам просто нужно позаботиться о любых удержаниях, которые вы вызываете, и не беспокоиться о «фактическом» количестве удержаний.

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

Я не уверен на 100% в каждом счете, но вот некоторые из них:

  • Реализация - 1
  • NIB - 1 +
  • Сильные свойства (1+)

Дополнительно любые свойства, которые перечисляют его как сильное свойство (в ARC).Я заметил, что когда вы запускаете перо и используете компоненты контроллера в дизайне кончика, это увеличит количество ссылок (сильно) на экземпляре контроллера.

...