Почему автор не выполняет выпуск на childController в следующем сегменте кода?

#iphone #objective-c #ios #memory-management

#iPhone #objective-c #iOS #управление памятью

Вопрос:

Я делал учебник, и автор показывает пример, однако мне любопытно, почему он не выпускает childController в конце функции. Есть мысли?

  -(void)tableView:(UITableView *) tableView
    accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath{

    if (childController==nil) {
        childController = [[DisclosureDetailController alloc] initWithNibName:@"DisclosureDetailController" bundle:nil];
    }   
        childController.title=@"Disclosure Button Pressed"; //why this line?????
        NSUInteger row = [indexPath row];
        NSString *selectedMovie = [list objectAtIndex:row];
        NSString *detailMessage = [[NSString alloc]initWithFormat:@"you pressed disclosure button for %@",selectedMovie];

        childController.message = detailMessage;
        childController.title = selectedMovie;
        [detailMessage release];
        [self.navigationController pushViewController:childController animated:YES];

    }
  

Ответ №1:

Похоже, что childController является полем в этом классе и поэтому (надеюсь) выпускает его в разделе dealloc.

На самом деле он / она создает его только один раз.

Редактировать:

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

Комментарии:

1. Но с каждым нажатием на ячейку TableView разве это не продолжало бы создавать childController, увеличивая его количество сохранений?

2. @jini: Нет. Предположительно, это childController будет только nil в первый раз, где затем он будет создан во второй строке с использованием alloc/init . С этого момента при вызове этого метода if (childController==nil) будет возвращать NO, а следующая строка, которая создает экземпляр, будет пропущена.

Ответ №2:

Он придерживается childController как ivar, поэтому предположительно он будет выпущен в dealloc методе класса.