2009-02-25 5 views
1

Вот гипотетический геттер:iPhone вопрос, касающийся управления памятью

- (DetailViewController *)detailController 
{ 

    if (detailController == nil) { 
     DetailViewController *controller = [[DetailViewController alloc] initWithNibName:@"Detail" bundle:nil]; 
     self.detailController = controller; 
     [controller release]; 
    } 

    return detailController; 
} 

Тогда код, который называет это выглядит как:

- (void)loadControllerOrSomething 
{ 
    DetailViewcontroller *controller = self.detailController; 
    [navigationController doSomethingWith:controller]; 
} 

Мой вопрос об управлении памятью заключается в следующем. Если я позволю * контроллеру выйти из области действия здесь, в loadControllerOrSomething, я пропущу память? Должен ли я делать контроллер = nil после работы с navigationController?

ответ

3

Нет, вы ничего не пропустите.

До его возвращения не было добавлено дополнительное сохранение, и после его поступления не сохранялось. Если вам нужно гарантировать, что это существование вне сферы ваших функций, вы должны называть его сохранением и освобождать, когда это будет сделано.

Как правило, управление памятью работает в какао. Когда объект возвращается функцией, у вас нет прав собственности. Если вы не назовете «сохранить», он будет удален, когда он достигнет своего естественного жизненного цикла, который может быть следующим фреймом, в следующую минуту или около того.

Исключение составляют функции с именами, содержащими «alloc» или «copy», и которые возвращают новый объект. Вы несете ответственность за вызов выпуска, когда он больше не нужен.

Смежные вопросы