Почему Apple создает свои взгляды таким образом - PullRequest
3 голосов
/ 01 мая 2010

В надежде исправить мою ошибку из другого поста, я хотел бы знать, почему Apple пишет это (для примера Elements)

UIView *localContainerView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
self.containerView = localContainerView;
[localContainerView release];

вместо более простого метода:

containerView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];

Ответы [ 2 ]

3 голосов
/ 01 мая 2010

self.containerView = на самом деле [self setContainerView:], что обычно освобождает любое предыдущее значение перед назначением нового значения. Когда вы присваиваете напрямую, вы должны знать, что член не удерживал ссылку ни на что, например, потому что вы только что выпустили его или проверили на значение nil.

[self setContainerView:] также может обрабатывать любую дополнительную обработку.

2 голосов
/ 01 мая 2010

Ну, на этот вопрос сложно ответить, учитывая, что демонстрируемый вами «более простой метод» может привести к совершенно оптимальному коду или довольно неудачной утечке памяти!

Как указывает Drawnonward, установка self.containerView аналогична вызову [self setContainerView:], и если вы используете @synthesize для генерации своих методов получения и установки, ваш метод setContainerView: будет выглядеть примерно так:

- (void)setContainerView:(UIView *)view {
    if (containerView != view) {
        [view retain]
        [containerView release];
        containerView = view;
    }
}

Как вы можете видеть, эти сеттеры управляют всем управлением памятью за вас, поэтому я считаю, что Apple любит поощрять разработчиков воспользоваться этим.

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

РЕДАКТИРОВАТЬ : вы можете делать то, что вы пытаетесь сделать, в одной строке кода, а также использовать ваш установщик для упрощения управления памятью, с помощью следующего:

self.containerView = [[[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]] autorelease];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...