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ł.
- 1. Jaki jest cel metody Objects.compare()?
- 2. Jaki jest cel metody Thread.SpinWait?
- 3. Jaki jest cel metody attribute-target?
- 4. W jaki sposób przeliczana jest wartość NSObject?
- 5. Jaki jest cel HttpHeaders.TryAddWithoutValidation?
- 6. Jaki jest cel IApplicationBuilder.New()
- 7. Jaki jest cel vertexAttribPointer?
- 8. Jaki jest cel przypisania metody w testach Rails (MiniTest)?
- 9. Jaki jest cel klasy TestExecution w MSTest?
- 10. Jaki jest cel metody setSelector w klasie NSInvocation?
- 11. Jaki jest cel metody assoc i rassoc w tablicy Ruby?
- 12. Jaki jest cel nowej metody Boolean() w JavaScript?
- 13. Jaki jest cel curdoc()?
- 14. Jaki jest cel Rake?
- 15. Jaki jest cel aclocal?
- 16. Jaki jest cel "() =>"
- 17. Jaki jest cel $ w XSLT
- 18. Jaki jest cel CMakeScripts?
- 19. Jaki jest cel IAsyncStateMachine.SetStateMachine?
- 20. Jaki jest cel używania?
- 21. Jaki jest cel XNoImplicitPrelude?
- 22. Jaki jest cel Ember.Container
- 23. Jaki jest cel ldexp?
- 24. Jaki jest cel Mage_Core_Block_Template_Facade
- 25. Jaki jest cel preompompiledApp.config?
- 26. Jaki jest cel JNDI
- 27. Jaki jest cel layout.xml?
- 28. Cel C - Jak korzystać z metody initWithCoder?
- 29. Jaki jest cel funkcji "dekonstrukcji" modelu Django?
- 30. Jaki jest cel TaskCreationOptions z TaskCompletionSource?
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? –