вызывающий
self = [super init];
Может возвращать ноль, если суперкласс не может инициализировать себя по тем или иным причинам, в том числе из-за недоступности памяти или если определенные условия не были выполнены. Если это так, вы не хотите пытаться устанавливать переменные self, устанавливать self в качестве делегата или добавлять self в массив, если self равно nil.
Пул авто-релизов создается при каждом событии, которое iPhone отправляет вашему приложению. Он создается перед выполнением любого кода и выпускается после выполнения всего вашего кода для каждого события. Любые объекты, которые вы называете autorelease
, будут включены в текущий пул автоматического выпуска. Любые объекты в пуле автоматического выпуска будут освобождены столько раз, сколько они были добавлены, после завершения вашего кода. Таким образом, вам не нужно беспокоиться о том, кто отвечает за освобождение объекта, созданного одним методом и возвращенного другому методу.
При необходимости вы можете создавать собственные пулы автоматического выпуска.
str = [[NSString alloc] initWithString:@"Hi there!"];
Эта строка создает строку, которая не входит в пул авто-релиза, поэтому вы должны освободить ее вручную. Просто пишу
@"Hi there!";
возвращает строку, о которой вам не нужно беспокоиться об освобождении. Расширяем ваш предыдущий пример:
str = [[[NSString alloc] initWithString:@"Hi there!"] autorelease];
будет другим методом создания строки, о которой вам не нужно беспокоиться об освобождении.
Одно из различий между пулами сборки мусора и автоматического выпуска состоит в том, что сборка мусора работает с циклическими ссылками. Используя пулы авто-релиза, вы не хотите иметь два объекта, которые сохраняют друг друга, и надеетесь, что, если на них ничего не ссылается, они исчезнут; они не будут.