2012-12-15 10 views
11

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?

+0

Cóż, czemu nie ...? –

+1

Pytanie brzmiało: "Dlaczego ktoś miałby chcieć ..." lub "Jaki jest cel ...", a nie "Dlaczego tam jest?" – Matoe

+1

To wydaje się być poprawnym pytaniem. Dlaczego spadki? –

Odpowiedz

12

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.

+1

"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. –

-1

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ź.

2

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ł.