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

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

Это код:

-(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 раза внутри по собственным причинам. Это не проблема.

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

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

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

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

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

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

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

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

Другие вопросы по тегам