Пользовательский Getter & Setter iOS 5
Я хочу переопределить getter и setter в моем классе ObjC с помощью ARC.
.h Файл
@property (retain, nonatomic) Season *season;
.m Файл
@synthesize season;
- (void)setSeason:(Season *)s {
self.season = s;
// do some more stuff
}
- (Season *)season {
return self.season;
}
Я что-то пропустил?
Ответы
Ответ 1
Да, это бесконечные рекурсивные циклы. Это потому, что
self.season = s;
переводится компилятором в
[self setSeason:s];
и
return self.season;
переводится в
return [self season];
Избавьтесь от dot-accessor self.
, и ваш код будет правильным.
Однако этот синтаксис может сбивать с толку, учитывая, что ваше свойство season
и ваша переменная season
имеют одно и то же имя (хотя Xcode несколько уменьшит путаницу, покрасив эти объекты по-разному). Можно явно изменить имя переменной, написав
@synthesize season = _season;
или, еще лучше, опустить директиву @synthesize
вообще. Современный компилятор Objective-C автоматически синтезирует методы доступа и переменную экземпляра для вас.
Ответ 2
Если вы собираетесь реализовать свой собственный getter и setter, вам нужно будет сохранить внутреннюю переменную:
@synthesize season = _season;
- (void)setSeason:(Season *)s {
// set _season
//Note, if you want to retain (as opposed to assign or copy), it should look someting like this
//[_season release];
//_season = [s retain];
}
- (Season *)season {
// return _season
}
Ответ 3
Недопустимо то, что компилятор Objective-C в основном превращает синтаксис self.foo = bar
в [self setFoo:bar]
и self.foo
в [self foo]
. Ваши методы, как в настоящее время реализованы, называют себя. Как предполагает Джереми, вам необходимо реализовать их таким образом, чтобы сеттер фактически назначал значение, вызванное им, переменной экземпляра в вашем классе, а получатель возвращал значение этой переменной экземпляра.