Класс не устанавливается как ожидалось - PullRequest
0 голосов
/ 06 августа 2011

Значок установлен как @property (nonatomic, retain) AHGridIcon *icon;

Обычно я просто делаю:

-(void)setIcon:(AHGridIcon *)iconLocal {
icon = iconLocal;
} 

Но я прочитал руководство по сеттерам и свойствам геттеров, которое заставило меня поверить, что вместо этого это правильно:

-(void)setIcon:(AHGridIcon *)iconLocal {
    if (iconLocal != self.icon)
    {
        NSLog(@"local: %@", iconLocal);
        NSLog(@"self.icon 1: %@", self.icon);
        [iconLocal retain];
        [icon release];
        icon = iconLocal;
        NSLog(@"self.icon 2: %@", self.icon);
    }
}

Проблема в том, что исходный значок остается на месте, он не заменяется новым значком. Что я делаю неправильно? Должен ли я просто вернуться к обычному способу, которым я это делаю?

Ответы [ 2 ]

2 голосов
/ 06 августа 2011

Вы должны использовать '@synthesize', если вам действительно не нужно поведение пользовательского установщика.

1 голос
/ 06 августа 2011

, как я написал в своем комментарии:

лучший способ - использовать @synthesize, который создаст метод получения и установки для свойств, которые вы написали в своем свойстве (nonatomic, retain) => непотокобезопасный, но быстрый метод получения и установки и удерживающий (и также освобождающий) установщик.Если вам не нужны сложные вещи в вашем сеттере, вам не следует переопределять сеттер.

.h:

@property (nonatomic, retain) AHGridIcon *icon;

.m:

@implementation Something
@synthesize icon;
...
@end

код, который вы разместили в своем установщике, почти такой же, как и при использовании только синтезатора.

Ваш обычный способ не очень хорош, потому что в вашем заголовке определено (в вашем свойстве), что установщик сохраняет, нов вашей реализации вы переопределяете тот правильный установщик, который не сохраняет.Это почти то же самое, что компилятор выдает со свойством (nonatomic, assign).

Но если вы хотите переопределить ваш установщик, он должен выглядеть так же, как вы написали.Для меня это работает нормально.

  1. сначала сохраняя новый объект
  2. , затем освобождая старый
  3. , затем назначая локальный указатель вашему новому объекту

вы можете даже опустить свой 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
...