Подтвердить что ты не робот

Позволяет ли [self release] управлять временем жизни объекта?

Я хочу создать объект в Objective C, но у меня нет ссылки на него.

Разрешено ли объекту контролировать собственное время жизни, вызывая [self release]?

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

Итак, допустимо ли следующее?

- (void) destroyMyself {
   [[NSNotificationCenter defaultCenter] removeObserver:self];

   [self release];
} 
4b9b3361

Ответ 1

Правила просты. Вы должны только отпустить объект, если вы его владеете. то есть объект был получен с помощью метода, начинающегося с "нового" или "alloc" или метода, содержащего копию.

Cocoa Правила управления памятью

Следовательно, объект не должен делать [self release] или [self autorelease], если он ранее не выполнял [self сохранить].

Ответ 2

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

Хорошим примером того, когда это имеет смысл, является создание объекта, который отключается для загрузки URL-адреса. Объект находится в памяти при загрузке URL-адреса, затем отправляет сообщение своему делегату, говоря, что данные готовы (или URL-адрес не может быть загружен). Как только его сообщение отправлено, оно уничтожает себя, поскольку его больше не нужно. В этой ситуации код/​​функция, которая создала "загрузчик URL", может уже не быть в памяти, т.е. Если она была вызвана в ответ на выбор пользователя элементом меню или действием в контроллере представления, который больше не находится на экране.

Это полезно, когда код, создающий объект "загрузка", не заботится о завершении загрузки или нет.

Ответ 3

Процитировать великого философа Алисию Сильверстоун: " У меня было подавляющее чувство ловкости, когда я это прочитал. Но я не мог сказать вам, почему.

Думаю, я бы использовал autorelease вместо простого release, так как вы все еще выполняете код в self, когда вы его вызываете, но кроме этого я не могу придумать никаких технических причин, почему он работа.

Ответ 4

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

Я сделал подобное для схемы сбоев, прежде чем мы получили CoreData.

Ответ 5

Хорошо, что часть протокола заключается в том, что если вы отправляете релиз в себя, то вам следует отправить и сохранить один раз, и я полагаю, что вы это делаете. Тогда нет ничего подозрительного. Я имею в виду, что код выделения должен иметь возможность контролировать время жизни вашего экземпляра; это само по себе может только продлить его жизнь, никогда не сокращать его (так как он короче, тогда вы вдруг оставите владельца выделения экземпляра с недопустимым указателем).

Ответ 6

И я буду использовать [self autorelease] вместо [self release]. Потому что обычно он называется

- (void)aMethod
{
    [self.delegate aDelegateMethod:self];
    [self release];

//If you add code related to self here, after [self release], you are making a huge mistake.
}

Если я использую [self autorelease], я все еще могу сделать что-то после авторекламы.