2012-03-21 8 views

Odpowiedz

16

Objective-C jest dynamiczna, chociaż będąc programistą Ruby, chciałbym powiedzieć, że nie jest tak dynamiczny jak Ruby.

Objective-C ma odpowiednik method_missing. Będziemy chcieli, aby zastąpić zarówno forwardInvocation: i methodSignatureForSelector: i wykonaj to ważne porady od Apple:

Ważne odpowiedzieć na metodach, że obiekt nie sama rozpoznać, trzeba zastąpić methodSignatureForSelector: oprócz forwardInvocation :. Mechanizm przekazywania wiadomości używa informacji uzyskanych z metodySignatureForSelector: do utworzenia obiektu NSInvocation do przekazania. Twoja nadpisująca metoda musi dostarczyć odpowiednią sygnaturę metody dla danego selektora, albo przez preformulację, albo przez zapytanie innego obiektu o jeden.

Nie używaj doesNotRecognizeSelector: jak Apple ostrzega, że ​​it must always result in an exception being thrown.

Proszę zapoznać się z dokumentacją klasy NSObject dalszych szczegółów: http://developer.apple.com/library/ios/#DOCUMENTATION/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html

+0

+1 za doskonałą odpowiedź! – Vignesh

+1

Zobacz także sekcję [Przesyłanie wiadomości] (https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtForwarding.html#//apple_ref/doc/uid/TP40008048- CH105) w Przewodniku po bieżącym środowisku Objective-C. –

-1

Domyślam się, że method_missing to metoda wywołania zwrotnego, która jest wywoływana, gdy obiektowi brakuje pewnej metody. Cóż, możesz użyć metody respondsToSelector, aby sprawdzić, czy obiekt może odpowiedzieć na metodę. Jest to metoda zadeklarowana w protokole NSObject. Zamiast wywoływania metody method_missing po stwierdzeniu, że brakuje jakiejś metody, można ją sprawdzić wcześniej.

if ([myObject respondsToSelector:@selector(someMethodThatMightBeMissing:)]) 
    NSLog(@"The method is missing"); 
+0

'responsesToSelector:' w Objective-C odpowiada 'response_to?' W Ruby, a nie 'method_missing'. – louielouie

+0

Pozdrawiam, wydaje się prostsze niż louielouie, jaka jest różnica, ponieważ nie jestem w stanie ocenić jako początkujący dzięki :) – user310291

+0

Ten, który zasugerowałem pomaga w sprawdzeniu, czy obiekt może reagować na metodę. Najczęściej będziesz chciał użyć tej metody, gdy podejrzewasz, że obiekt może nie reagować na metodę, jest to pewien środek ostrożności. Jeśli obiekt lub jego poprzednik (y) nie mają takiej metody, twój program ulegnie awarii. Ale wywołanie metody tylko z warunkiem, że obiekt zareaguje na nią, zapobiegnie awariom programu. Metoda method_missing, o ile rozumiem, to metoda, która jest wywoływana, gdy taka sytuacja ma miejsce i nie pozwala na awarię twojego programu. Tak więc ten pierwszy jest przeznaczony do chekingowania, a drugi do obsługi przypadku. –