Пользовательский геттер и сеттер iOS 5 - PullRequest
33 голосов
/ 04 января 2012

Я хочу переопределить метод получения и установки в моем классе 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;
}

Я что-то здесь упускаю?

Ответы [ 3 ]

88 голосов
/ 04 января 2012

Да, это бесконечные рекурсивные циклы. Это потому что

self.season = s;

переводится компилятором в

[self setSeason:s];

и

return self.season;

переведено на

return [self season];

Избавьтесь от dot-accessor self. и ваш код будет правильным.

Однако этот синтаксис может сбивать с толку, учитывая, что ваше свойство season и ваша переменная season имеют одно и то же имя (хотя Xcode несколько уменьшит путаницу, если по-разному раскрасить эти объекты). Можно явно изменить имя переменной, написав

@synthesize season = _season;

или, что еще лучше, пропустите директиву @synthesize. Современный компилятор Objective-C автоматически синтезирует для вас методы доступа и переменную экземпляра.

16 голосов
/ 04 января 2012

Если вы собираетесь реализовать свой собственный метод получения и установки, вам нужно будет поддерживать внутреннюю переменную:

@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
}
5 голосов
/ 04 января 2012

Вам не хватает того, что компилятор Objective C в основном превращает синтаксис self.foo = bar в [self setFoo:bar], а self.foo в [self foo].Ваши методы в том виде, в котором они реализованы в настоящее время, вызывают сами.Как предлагает Джереми, вам нужно реализовать их так, чтобы установщик фактически назначал значение, с которым он вызывался, переменной экземпляра в вашем классе, а получатель возвращает значение этой переменной экземпляра.

...