Программно созданные подпредставления и viewDidUnload - PullRequest
2 голосов
/ 22 июня 2011

Для контроллера представления любые выходы, которые вы устанавливаете в Интерфейсном Разработчике, должны быть освобождены и иметь значение nil в viewDidUnload , а также должны быть освобождены в dealloc .

(см .: Когда я должен выпускать объекты в viewDidUnload , а не в dealloc ? )

Одна из наиболее важных причин реализации [ viewDidUnload ] заключается в том, что подклассы UIViewController обычно также содержат ссылки на различные подпредставления в иерархии представлений.Эти свойства могли быть установлены через IBOutlets при загрузке из пера, или программно внутри loadView [выделение добавлено] , например.

Мой вопрос заключается в том, нужно ли нам реализовывать viewDidUnload для подпредставлений в иерархии представлений, которые создаются программно в loadView (без Interface Builder)?

Ответы [ 3 ]

5 голосов
/ 22 июня 2011

Это зависит от того, как вы их создали и нужно ли ссылаться на них где-либо еще.

Например:

- (void)loadView
{
    [super loadView];

    UIButton *someButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    someButton.frame = CGRectMake(0, 0, 50, 50);
    [self.view addSubview: someButton];
}

В приведенном выше случае вам не нужно реализовывать viewDidUnload, потому что someButton автоматически высвобождается в loadView.

Другой пример:

- (void)loadView
{
    [super loadView];

    self.someButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    someButton.frame = CGRectMake(0, 0, 50, 50);
    [self.view addSubview: someButton];
}

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

2 голосов
/ 22 июня 2011

Вы, конечно, должны .Однако, если вы посмотрите образцы Apple, то обнаружите, что иногда они просто используют dealloc.Если вы знаете, что ваш объект будет освобожден в какое-то разумное время после использования, я думаю, что это совершенно разумно.Однако я следую этому шаблону, так как viewDidUnload может не вызываться в определенных исключительных случаях.На самом деле я не называю метод release таким длинным именем:

-(void)releaseRetainedXibAndViewDidLoadObjects
{
    self.myLabel = nil;
    self.myImage = nil;
}

-(void)viewDidUnload
{
    [super viewDidUnload];
    [self releaseRetainedXibAndViewDidLoadObjects];
}

-(void)dealloc
{
    self.myObject = nil;
    [self releaseRetainedXibAndViewDidLoadObjects];
    [super dealloc];
}

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

0 голосов
/ 22 июня 2011

Сделайте это по вашему dealloc методу. Нет гарантии, что viewDidUnload будет вызван. Обычно он вызывается только тогда, когда контроллеру необходимо выгрузить представление, например, когда есть предупреждение памяти. С другой стороны, спаривание init / dealloc всегда будет вызываться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...