Соглашение состоит в том, что когда вы создаете объект с использованием метода класса, он должен быть автоматически освобожден. Это означает, что в конце цикла выполнения при сбросе пула автоматического выпуска эти объекты будут освобождены. Однако, если вы создадите что-либо, используя + alloc] -init] или -copy, -mutableCopy или + new (что аналогично + alloc] -init]), это не будет автоматически выпущено.
Например:
NSArray *array1 = [NSArray arrayWithObject:@"foo"];
NSArray *array2 = [[NSArray alloc] initWithObject:@"foo"];
Array1 будет автоматически выпущен, и вам не нужно об этом беспокоиться. Array2 необходимо будет разблокировать вручную. Или вы можете сделать:
NSArray *array2 = [[[NSArray alloc] initWithObject:@"foo"] autorelease];
Что в значительной степени делает + arrayWithObject:
Конечно, это приводит к важному рассмотрению времени жизни переменных экземпляра. Если вы создадите переменную экземпляра, как в случае с array2, то все будет в порядке, поскольку она имеет счет сохранения 1. Однако, массив1 нужно будет сохранить, иначе он будет автоматически освобожден в конце цикла выполнения, что даст ему счет сохранения 0 и поэтому он будет освобожден, и вы останетесь с висящим указателем.