#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
методе класса.