, как я написал в своем комментарии:
лучший способ - использовать @synthesize
, который создаст метод получения и установки для свойств, которые вы написали в своем свойстве (nonatomic, retain)
=> непотокобезопасный, но быстрый метод получения и установки и удерживающий (и также освобождающий) установщик.Если вам не нужны сложные вещи в вашем сеттере, вам не следует переопределять сеттер.
.h:
@property (nonatomic, retain) AHGridIcon *icon;
.m:
@implementation Something
@synthesize icon;
...
@end
код, который вы разместили в своем установщике, почти такой же, как и при использовании только синтезатора.
Ваш обычный способ не очень хорош, потому что в вашем заголовке определено (в вашем свойстве), что установщик сохраняет, нов вашей реализации вы переопределяете тот правильный установщик, который не сохраняет.Это почти то же самое, что компилятор выдает со свойством (nonatomic, assign).
Но если вы хотите переопределить ваш установщик, он должен выглядеть так же, как вы написали.Для меня это работает нормально.
- сначала сохраняя новый объект
- , затем освобождая старый
- , затем назначая локальный указатель вашему новому объекту
вы можете даже опустить свой if, но тогда действительно важно, чтобы вы сначала сохранили новые, а затем освободили старые объекты (как вы это сделали - просто хотите упомянуть об этом).
Для решенияваша проблема с переопределенным сеттером: ваш сеттер выглядит нормально в моих глазах.Вы также перезаписали добытчик?Если да, то опубликуйте его здесь (вы используете его, вызывая self.icon в своем лог-вызове).
Я выполнил небольшую тестовую программу
@synthesize str;
- (void)setStr:(NSString *)localStr
{
if(str != localStr)
{
NSLog(@"old : %@", self.str);
NSLog(@"new1: %@", localStr);
[localStr retain];
[str release];
str = localStr;
NSLog(@"new2: %@", self.str);
}
}
, и выводштраф:
old : (null)
new1: Hello
new2: Hello
old : Hello
new1: World
new2: World