nie wszystkie getters wziąć tę postać:
- (id)variable { return variable; }
... to jest po prostu najbardziej prymitywna forma. same właściwości powinny sugerować więcej kombinacji, które zmieniają implementację. powyższy prymitywny akcesor nie uwzględnia idiomów używanych w połączeniu z zarządzaniem pamięcią, atomowością lub semantyką kopiowania. implementacja jest również delikatna w nadpisaniach podklas.
kilka naprawdę krótkich przykładów; rzeczy oczywiście stają się bardziej złożone w prawdziwych programach, w których implementacje stają się znacznie bardziej złożone.
1) getter może nie zwrócić zmiennej instancji.jedna z kilku możliwości:
- (NSObject *)a { return [[a copy] autorelease]; }
2) Seter może nie zachować zmiennej instancji. jedna z kilku możliwości:
- (void)setA:(NSObject *)arg
{
...
a = [arg copy];
...
}
3) skończyć z wdrożenia zarządzania pamięcią w całym programie, co sprawia, że trudno jest utrzymać. semantyka klasy (i jak obsługuje ref liczenia Instancji zmiennych) powinno być ograniczone do klasy i postępuj konwencje dla oczekiwanych wyników:
- (void)stuff:(NSString *)arg
{
const bool TheRightWay = false;
if (TheRightWay) {
NSMutableString * string = [arg mutableCopy];
[string appendString:@"2"];
self.a = string;
[string release];
// - or -
NSMutableString * string = [[arg mutableCopy] autorelase];
[string appendString:@"2"];
self.a = string;
}
else {
NSMutableString * string = [arg mutableCopy];
[string appendString:@"2"];
self.a = string;
[self.a release];
}
}
niestosowanie się do tych prostych zasad sprawia, że kod trudne do utrzymania i debugowania i bolesne do rozszerzenia.
więc najtrudniej jest, aby program był łatwy w utrzymaniu. wywoływanie zwalniania bezpośrednio na obiekcie wymaga znajomości wielu kontekstów wewnętrznych działań klasy; to oczywiście źle i brakuje dobrych ideałów dobrego OOD.
oczekuje również od autorów/subklasujących/klientów, aby dokładnie wiedzieli, w jaki sposób klasa odstaje od konwencji, co jest głupie i czasochłonne, gdy pojawiają się problemy i musisz ponownie nauczyć się wszystkich wewnętrznych szczegółów, gdy pojawiają się problemy (będą one w pewnym momencie).
to niektóre z trywialnych przykładów na to, w jaki sposób wywoływanie wersji z wyników właściwości wprowadza problemy. wiele problemów w świecie rzeczywistym jest znacznie trudniejszych do zlokalizowania.
To bardzo niebezpieczne zalecenie; getter nie zawsze tak będzie wyglądać. W rzeczywistości, gdyby była to własność "atomowa", to -retain/-autorelease. – bbum