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? 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.
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
}
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.
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