Custom Getter & Setter iOS 5

Chcę nadpisać getter i setter w mojej klasie ObjC używając ARC.

.plik h

@property (retain, nonatomic) Season *season;

.plik m

@synthesize season;


- (void)setSeason:(Season *)s {
    self.season = s; 

    // do some more stuff
}

- (Season *)season {
    return self.season;
}
Czy coś mi umknęło?
Author: alex, 2012-01-04

3 answers

Tak, są to nieskończone pętle rekurencyjne. To dlatego, że

self.season = s;

Jest tłumaczone przez kompilator na

[self setSeason:s];

I

return self.season;

Jest tłumaczone na

return [self season];

Pozbądź się Dot-accessor self. Twój kod będzie poprawny.

Ta składnia może być jednak myląca, biorąc pod uwagę, że Twoja właściwość season i twoja zmienna season mają tę samą nazwę (chociaż Xcode nieco zmniejszy zamieszanie, kolorując te encje inaczej). On można jawnie zmienić nazwę zmiennej pisząc

@synthesize season = _season;

Lub, jeszcze lepiej, całkowicie pomiń dyrektywę @synthesize. Nowoczesny kompilator Objective-C automatycznie zsyntetyzuje metody dostępu i zmienną instancji.

 88
Author: jlehr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-13 00:13:13

Jeśli zamierzasz zaimplementować własny getter i setter, musisz zachować wewnętrzną zmienną:

@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
}
 16
Author: Jeremy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-04 17:19:49

Brakuje ci tego, że kompilator Objective-C zmienia składnię self.foo = bar na [self setFoo:bar], A self.foo na [self foo]. Twoje metody, jak obecnie zaimplementowane, nazywają się same. Jak sugeruje Jeremy, musisz zaimplementować je w taki sposób, aby setter rzeczywiście przypisał wartość wywołaną do zmiennej instancji w twojej klasie, A getter Zwraca wartość tej zmiennej instancji.

 5
Author: Noah Witherspoon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-04 17:10:55