Вызов [self release]
- это большое нет-нет, потому что ни у одного объекта нет информации о том, что другой объект ссылается на него.Система хранения предназначена для обеспечения того, чтобы, если ObjA нуждался в ObjB, этот ObjB оставался в памяти, пока ObjA больше не нуждается в нем.Если ObjB освобождает себя, вся система выходит из строя.
В этом случае UIAlert
сам сохраняет объект AlertUtility
в качестве его делегата, поэтому вы можете освободить AlertUtility
, как только закончите с ним, так же, как вы UIAlert
.
Итак, все в порядке:
AlertUtility *utility = [[AlertUtility alloc] init];
[utility displayAlert];
[utility release]; // released here, but still alive
Это не проблема, если объект AlertUtility
еще жив после выпуска.Релиз не обязательно убивает объект.Это просто говорит о том, что объект, отправляющий сообщение об освобождении, больше не нуждается в освобожденном объекте.Каждый сохраняющий объект просто обязан сбалансировать все удержания (включая неявные, такие как init
) с выпуском.В прошлом, что удерживающий объект не имеет никакого интереса и не несет ответственности за то, поддерживает ли система освобожденный объект живым или нет.
В конце концов, любой отдельный объект может быть сохранен несколькими сохраняющимися объектами, каждый из которых не знает другого.В этом случае AlertUtility
сохраняется один раз ViewController с init
. Затем он снова сохраняется UIAlert
в качестве делегата. ( Редактировать: UIAlert назначает ему делегата ) Когда ViewController выпускает AlertUtility
объект, он останется живым до тех пор, пока это нужно UIAlert
, и наоборот.
Поскольку объект UIAlert
сохраняется при отображении UIWindow
, это означает, что объект AlertUtility
будет оставаться живым до тех пор, пока не будет отклонен UIAlert
. (Изменить: это действительно только для представления, но не для делегата AlertUtility)
Обычно у вас не будет делегата UIAlert
, существование которого зависит исключительно от существования самого UIAlert
. Обычно делегат UIAlert
является контроллером представления, который вызывает предупреждение.Таким образом, вам не нужно беспокоиться о смерти делегата до того, как он завершит задачу, связанную с предупреждением.