To wszystko. Dlaczego ktokolwiek chciałby (przynajmniej jako publiczny interfejs API) taką metodę? Czy jest w tym jakiś praktyczny użytek?Jaki jest cel metody -self w klasach zgodnych z NSObject?
Odpowiedz
Metoda self
jest przydatna do kodowania wartości kluczowej (KVC).
Za pomocą KVC można traktować obiekt nieco jak słownik. Możesz uzyskać dostęp do właściwości obiektu, używając ciągu znaków zawierającego nazwę właściwości, na przykład: [view valueForKey:@"superview"]
. Schodzisz łańcuch właściwości za pomocą łańcucha zawierającego ścieżkę klucza: [view valueForKeyPath:@"superview.superview.center"]
.
Od NSObject
ma metodę self
, można użyć self
jako klucz lub ścieżka klucza: [view valueForKey:@"self"]
. Jeśli więc programujesz ścieżkę kluczową lub czytasz je z pliku, użycie klawisza "self"
może pozwolić Ci uniknąć pisania w specjalnym przypadku.
Można również użyć self
w orzeczników, tak:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self beginswith \"foo\""];
NSArray *filteredArray = [arrayOfStrings filteredArrayWithPredicate:predicate];
nie wiem czy NSPredicate
rzeczywiście wykorzystuje metodę self
(być może za pośrednictwem KVC) w tym przypadku. Jest to z pewnością możliwe.
"SELF" jest dokumentowany jako specjalna stała w NSPredicates, np. "Zero", "NULL" i kilka innych. Można go przypisać do rzeczywistej metody "ja", ale dla mnie dokumentacja sugeruje, że jest wyjątkowa. –
Myślę, że ma to związek z runtime ObjC.
objc_msgSend(autoreleasePool, sel_registerName("drain"));
BOOL AppDel_didFinishLaunching(struct AppDel *self, SEL _cmd, void *application, void *options)
Pierwszy argument to self. Myślę, że ma to coś wspólnego. Szczerze mówiąc, ponieważ skończyłoby się:
id self(struct id *self, SEL _cmd) {
return self;
}
.... To miało więcej sensu, zanim zacząłem pisać tę odpowiedź.
Nie jestem pewien, dlaczego "self" zostało dodane pierwotnie, ale jedną rzeczą, która przydała się była ochrona wskaźników wewnętrznych obiektów. Oficjalną rekomendacją firmy Apple było wstawienie wywołania [foo self] po zakończeniu wewnętrznego wskaźnika; wywołanie metody nie działa nic, ale zapewnia, że kompilator będzie się do tego czasu wynosił.
Cóż, czemu nie ...? –
Pytanie brzmiało: "Dlaczego ktoś miałby chcieć ..." lub "Jaki jest cel ...", a nie "Dlaczego tam jest?" – Matoe
To wydaje się być poprawnym pytaniem. Dlaczego spadki? –