когда объекты выпущены - PullRequest
       4

когда объекты выпущены

0 голосов
/ 12 августа 2011

Я считаю, что должен освободить объект, если я создал его с ключевыми словами init, alloc, copy или move, как мне кажется. Я могу создавать объекты с кодом, который не использует эти ключевые слова, поэтому я думаю, что мне не нужно их выпускать правильно? возьмите, к примеру, этот код:

UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button addTarget:self 
           action:@selector(aMethod:)
 forControlEvents:UIControlEventTouchDown];
[button setTitle:@"Hello" forState:UIControlStateNormal];
button.frame = CGRectMake(40.0, 200.0, 170.0, 40.0);
[self.view addSubview:button];

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

Ответы [ 4 ]

3 голосов
/ 12 августа 2011

Единственный объект, который вы создали здесь, это UIButton, и вы использовали метод класса buttonWithType.Это возвращает вам автоматически выпущенный объект, так что вам не нужно его отпускать.

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

1 голос
/ 12 августа 2011

Существует NSAutoreleasePool, который управляет памятью для вас. Вы были правы в отношении alloc и copy (alloc и init обычно вместе), но не двигались. Еще один, который возвращает сохраненный объект - это методы с префиксом new ex. +(id)new;. Пул автоматического выпуска требуется для каждого потока, чтобы управлять памятью для каждого цикла событий.

Пример того, как может выглядеть реализация кнопки

-(id)buttonWithType:(UIButtonType)type
{
    UIButton *button = [[[UIButton alloc] initSecretlyWithType:type] autorelease]; 
    //Customize button if needed
    return button;
}

Подробнее см. Использование пулов автоматического освобождения .

1 голос
/ 12 августа 2011

Вы абсолютно правы в том, что вам не нужно явно публиковать то, чем вы не владеете, с помощью alloc, copy, new или retain.

В этом случае вы создаликнопка с помощью удобного метода (buttonWithType :).Это возвращает автоматически выпущенный объект UIButton.Он сбрасывается автоматически, когда пул автоматического выпуска сбрасывается в конце цикла выполнения.

Здесь вам не о чем беспокоиться.Пусть среда выполнения позаботится об этом.

1 голос
/ 12 августа 2011

Если вы используете XCode 4, я рекомендую запустить режим «анализ», чтобы выполнить быструю базовую проверку на утечки памяти ... которая выглядит хорошо (ваш код).

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