Поведение свойства по умолчанию - ASSIGN, а не RETAIN. Это не одно и то же поведение. Если ваше свойство для примитивного типа данных, такого как int, тогда ASSIGN будет правильным для использования. Однако, если вы укажете (сохраните) и свойство будет указывать на указатель объекта, такой как объект NSObject *, указателю будет назначен адрес памяти объекта, и его счетчик приращений увеличивается на единицу. Если ваша программа состоит только из одной основной функции, то ее цель трудно увидеть. Однако предположим, что у вашего класса был этот метод:
-(void)setMyArrayWithString:(NSString *)s{
myArray = [NSArray arrayWithObject:s];
}
Предположим, что myArray определен как NSArray * myArray и имеет правильный оператор @property (retain).
Все работает нормально, пока метод не вернется. Это связано с тем, что объект, возвращаемый из NSArray, является автоматически выпущенным объектом. Если мы не сохраним его, он будет выпущен NSAutoReleasePool, и мы не сможем его использовать (и мы получим неприятные ошибки и нарушения прав доступа). Чтобы исправить это, мы можем сделать одну из двух вещей:
-(void)setMyArrayWithString:(NSString *)s{
self.myArray = [NSArray arrayWithObject:s];
// OR
myArray = [[NSArray arrayWithObject:s] retain];
}
Первое решение использует self.myArray для использования определения @property. Этот код присваивает, а затем сохраняет объект, чтобы мы не потеряли его при возврате из функции. Второе решение устанавливает указатель NSArray * myArray вручную, а затем вручную сохраняет объект NSArray. В любом случае NSAutoreleasePool освободит объект в конце функции, однако он не будет освобожден, потому что у нас все еще есть наше удержание от более раннего сохранения его.