Ваша утечка памяти не вызвана при использовании вашего сеттера.Утечка памяти вызвана тем, что вы неправильно управляете памятью!
Если вы объявите следующее свойство
@property (nonatomic, retain) id value;
Это означает, что компилятор генерирует методы, которые выглядят примерно так (очень упрощенно):
- (id)value {
return value;
}
- (void)setValue:(id)aValue {
[value autorelease];
value = [aValue retain];
}
Когда вы используете точечную запись, self.value = obj
выводится в [self setValue:obj]
.Отсюда вы фактически заставляете obj
оставаться в сеттере.Если вы изначально создадите ссылку на obj
(используя +alloc
без соответствующего -release
или -autorelease
), у вас будет избыточное удержание obj
, и оно никогда не будет освобождено.Следовательно, вам нужно сделать что-то вроде этого:
id obj = [[[NSObject alloc] init] autorelease];
self.value = obj;
или
id obj = [[NSObject alloc] init];
self.value = [obj autorelease];
или
id obj = [[NSObject alloc] init];
self.value = obj;
[obj release];
Что бы вы ни делали, вы должны убедиться, что когдаВы утверждаете право собственности на объект (сохраняя его), а также освобождаете его.