Подтвердить что ты не робот

Пользовательский 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;
}

Я что-то пропустил?

4b9b3361

Ответ 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]. Ваши методы, как в настоящее время реализованы, называют себя. Как предполагает Джереми, вам необходимо реализовать их таким образом, чтобы сеттер фактически назначал значение, вызванное им, переменной экземпляра в вашем классе, а получатель возвращал значение этой переменной экземпляра.