Неудерживаемые объекты: когда они освобождаются?

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

- (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 доступно только для чтения, и я не могу изменить его после инициализации кнопки.

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


person Andrea Sprega    schedule 15.02.2012    source источник


Ответы (2)


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

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

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

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

person yuji    schedule 15.02.2012
comment
О, хорошо, я пропустил часть цикла запуска. Можно ли уточнить текущую итерацию цикла выполнения? Связана ли эта итерация с одним методом или с чем-то более длительным, может быть, с фиксированным количеством времени? Может ли это быть все время жизни приложения? Я попытался понять больше, прочитав учебник, но никто не объясняет это явно. - person Andrea Sprega; 15.02.2012
comment
Текущая итерация цикла выполнения на самом деле настолько точна, насколько это возможно. Цикл выполнения — это цикл обработки событий в Cocoa. Вот хороший пост в блоге, если вы хотите узнать больше: blog.shinetech.com/2009/06/02/run-loops-vs-threads-in-cocoa - person yuji; 15.02.2012

метод без инициализации точно такой же, как:

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

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

person Ehab Amer    schedule 15.02.2012