Edit: Измененный в соответствии с рекомендациями компании Apple. Комментарии, следующие за этим ответом, относятся к моей оригинальной (и очень плохой) версии. В будущем я буду уделять должное внимание Practical Memory Management в iOS Developer Library.
Вопрос (1): Нет, вам не нужен дополнительный выпуск. После [[ASArray alloc] initWithArray:array]
ваш массив будет иметь счетчик 1
. В dealloc
звонок [_array release]
вернет его на 0
, и он должен быть освобожден.
Если [setArray:]
вызывается в то же время, он будет подчиняться его свойства декларации retain
путем сохранения нового объекта и отпускания старого.
Если какой-либо другой объект или метод сохраняет ваш массив, это их обязанность освободить его. Если значение сохранения вашего массива больше 1
в начале dealloc
, некоторый другой объект сохраняет его, по крайней мере, временно.
Вопрос (2): Вы можете проверить retainCount
во время выполнения, но как NSObject Protocol Reference предупреждает, что это легко для вашего объекта оказаться в нескольких бассейнах autorelease, что делает его счет бесцельно высокой.
Бонус: Вы можете думать, что [[NSArray alloc] initWithArray:array]
будет использовать сохранить кол входа и добавить 1
. Это происходит только в том случае, если «копия» выполняется путем сохранения и передачи ссылки на неизменяемый источник, и в этом случае другой объект также сохраняет ссылку на этот источник. [[NSString alloc] initWithString:]
определяет, является ли его источник неизменным и делает это; [[NSArray alloc] initWithArray:]
нет. [NSArray copy]
, с другой стороны, сохранит и вернет себя.
Эти оптимизации, конечно, специфичны для реализации и никогда не должны приниматься. Тем не менее, это может быть поучительно, чтобы построить некоторые объекты, избегая autorelease, и следить за их адреса и retainCounts, как это:
NSArray *array1 = [[NSArray alloc] initWithObjects:@"a", nil];
// Do not just assign array1 to [[NSArray alloc] init], or you'll get a singleton empty array with a high retain count.
// Make array1 mutable, and array2 should be copied differently.
NSLog(@"Constructed array1");
NSLog(@"array1 address = %p retainCount = %d", array1, [array1 retainCount]);
NSArray *array2 = [array1 copy];
// Use [[NSArray alloc] initWithArray:] and the results may be different.
NSLog(@"Constructed array2");
NSLog(@"array1 address = %p retainCount = %d", array1, [array1 retainCount]);
NSLog(@"array2 address = %p retainCount = %d", array2, [array2 retainCount]);
[array1 release];
NSLog(@"Released array1");
NSLog(@"array2 address = %p retainCount = %d", array2, [array2 retainCount]);
[array2 release];
Что «результаты» в '[[NSArray alloc] initWithArray: results];'? – dasblinkenlight
Извините, он должен сказать массив. Просто переданный массив из другого класса – Vikings