Ваш код верный: сеттер должен сохранять объект, если вы хотите сделать его «сильной» переменной. Но вам не нужно его выпускать: это не область ответственности сеттера. Таким образом, в коде, из которого вы звоните, вы будете:
- Выделить объект, который будет назначен;
- Позвоните в сеттер;
- Отпустите его, когда он вам больше не нужен.
Вы делаете это хорошо, за исключением того факта, что строки обычно копируются, поскольку, поскольку полиморфизм действителен, указатель может указывать изменяемый строковый объект, поэтому он может меняться с одного момента на другой.
Пример:
NSAutoreleasePool* pool=[[NSAutoreleasePool alloc]init];
NSString* newString= [[NSMutableString alloc]initWithString: @"Hello"]; // Retain count 1.
[newString autorelease]; // Still 1 as retain count, but it will be decreased
// when the pool will be drained.
[object setSomeThing: newString]; // Retain count 2.
[pool drain]; // Retain count 1
В этом примере вы ясно видите, почему вам нужно скопировать объект вместо его сохранения: это изменчивая строка поэтому она может быть изменена в любое время.
Копирование объекта
Если скопировать объект, то способ, как вы называете метод (так приведенный выше код) не изменится, она будет просто изменить реализацию метода. Что-то вроде этого:
- (void) setSomeThing:(NSString *) someThingNew
{
if(someThing!=someThingNew)
{
[someThing release]; // Retain count decreased by 1.
someThing = [someThingNew copy]; // Retain count 1.
}
}
... ...
- (void) dealloc
{
[someThing release];
[super dealloc];
}
@end
Objective C руководство управления памятью: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html – Kreiri