Не удерживаемые объекты: когда они выпущены? - PullRequest
0 голосов
/ 15 февраля 2012

Внутри метода инициализации у меня есть следующий код

- (id)init {

    self = [super init];

    if (self) {

        UIButton *tempButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        tempButton.frame = CGRectMake(0,0,300,44);

        // some custom code...

        self.myButton = tempButton;
    }

    return self;
}

Где myButton - оставшееся имущество. Я знаю, что для правил управления памятью этот метод равен другому:

- (id)init {

    self = [super init];

    if (self) {

        UIButton *tempButton = [[UIButton alloc] initWithFrame:CGRectMake(0,0,300,44)];

        // some custom code...

        self.myButton = tempButton;
        [tempButton release];
    }

    return self;
}

Но в этом случае мне нужно использовать первую «версию», потому что свойство buttonType доступно только для чтения, и я не могу изменить его после инициализации кнопки.

Поскольку я обнаружил, что использую версию «non init-release» в нескольких методах по всему приложению и для нескольких объектов (большинство из них NSString), мой вопрос: в этом случае не учитывается присвоение свойство, которое сохраняет объект, когда объект tempButton будет выпущен? Может быть, в конце утверждения метода / if? Или первая «версия» приведет к увеличению использования памяти, поскольку объект освобождается не сразу, а через некоторое время?

Ответы [ 2 ]

1 голос
/ 15 февраля 2012

Я думаю, что вы немного запутались: в обоих ваших фрагментах вы создаете объект tempButton, но затем назначаете его self.myButton.В этот момент и tempButton, и self.myButton являются указателями на один и тот же объект.Теперь, предположительно, myButton @property, который вы используете, является сильным свойством, поэтому, присваивая ему tempButton, вы увеличиваете количество сохранений, и, следовательно, в любой версии кода он будет иметь счет +1 в конце, и не будет освобожден.

Если, гипотетически, myButton не является сильным свойством, то в вашем коде будет ошибка, и в обоих случаях tempButtonбудет преждевременно освобожден и освобожден.Вот что произойдет в двух случаях:

В вашей первой версии, поскольку вы получаете tempButton из чего-то другого, чем метод init или copy, он получает счет сохранения +1, но автоматически выпущен.В конце текущей итерации цикла выполнения авто-релиз запускается, в результате чего его счетчик удержаний становится равным 0 и вызывается его освобождение.

Во второй версии вы сначала получаете tempButton со счетом сохранения 1, потому что он исходит из метода init.Но позже вы явно освобождаете его, доводя его счет удержания до 0, после чего он немедленно освобождается.

0 голосов
/ 15 февраля 2012

метод не-init точно такой же, как:

UIButton *tempButton = [[[UIButton alloc] initWithFrame:CGRectMake(0,0,300,44)] autorelease];

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

...