2013-08-17 8 views
16

Użyłem metody swizzling do zawijania wszystkich wywołań metod w klasie z dodatkowymi funkcjami. Konkretnie byłem:NSProxy kontra NSObject

  • Sprawdzanie, czy wymagane dla tego obiektu było wywołanie metody w pamięci podręcznej
  • Jeśli bufor miał ten przedmiot zwrócić go.
  • Jeśli nie, wyślij do oryginalnej implementacji, wypełnij pamięć podręczną i zwróć ją.

Dla każdej metody przekierowałbym do zalecanej metody. I zaimplementuj nową metodę przy użyciu + (BOOL) resolveInstanceMethod: (SEL) sel i IMP_implementationWithBlock.

To działało bez zarzutu, ale kod nie był ładnie czytany. Wygląda na to, że NSProxy zapewni lepszy sposób implementacji tej funkcjonalności.

Ale jeszcze inną alternatywą byłoby po prostu mieć stand-in podklasy NSObject i przechwytywać wywołania metod wokół metod mojego obiektu docelowego. Przez przesłonięcie do przodu Invocation i methodSignatureForSelector, mogę uzyskać wymagany wynik.

Co daje mi NSProxy? Dlaczego powinienem użyć tego zamiast tego?

Odpowiedz

12

Punkt NSProxy polega na tym, że nie implementuje większości metod. Konieczne jest upewnienie się, że maszyna do przekazywania Celu C zostanie wywołana na początku. Jeśli zaczynasz od NSObject, istnieje wiele metod, które zostaną bezpośrednio wysłane bez możliwości ich przekazania.

+2

Czy możesz być bardziej konkretny? W jakich okolicznościach? Zaimplementowałem serwer proxy i działa niezależnie od tego, czy rozszerzam NSProxy, czy nie. –

+0

Spójrz na interfejs 'NSObject'. Żadna z metod tam zdefiniowanych, które nie są zdefiniowane w 'NSProxy' ani nie zostanie nadpisana przez twoją klasę proxy, nie zostanie przekazana. Pamiętaj również o uwzględnieniu wszystkich kategorii w 'NSObject' (tych z implementacjami, a nie nieformalnych protokołach). Jednym z przykładów może być "-classForCoder" i przyjaciele. Co stanie się, jeśli spróbujesz zarchiwizować 'NSString' zawinięty w twoją klasę proxy? –

+0

Ah. . Odniosłem wrażenie, że doszło tylko do wyniku -methodSignatureForSelector –

Powiązane problemy