2010-02-27 15 views
16

Czy istnieje sposób wywołania [anObject performSelector]; z więcej niż 2 obiektami? Wiem, że możesz użyć tablicy do przekazania wielu argumentów, ale zastanawiałem się, czy istnieje sposób na niższy poziom wywoływania funkcji, którą już zdefiniowałem z więcej niż 2 argumentami bez użycia funkcji pomocnika z nsarray argumentów.performSelector z więcej niż 2 obiektami

Odpowiedz

48

Albo (1) Użyj NSInvocation lub (2) bezpośrednio użyj objc_msgSend.

objc_msgSend(target, @selector(action:::), arg1, arg2, arg3); 

(Uwaga: upewnij się, że wszystkie argumenty są id „s, w przeciwnym razie argumenty nie może zostać wysłany poprawnie.)

+12

Podczas korzystania objc_msgSend, trzeba #import wg: http://stackoverflow.com/questions/4896510/how-to-import-nsobjcruntime-h -to-use-objc-msgsend –

+1

ta ostatnia notka, którą napisałeś o upewnieniu się, że wszystkie argumenty są typu id. Czy możesz wyjaśnić dalej? lub dostarczyć trochę zasobów? Nie mogę znaleźć żadnego. –

14

można rozszerzyć klasę NSObject takiego:

- (id) performSelector: (SEL) selector withObject: (id) p1 
     withObject: (id) p2 withObject: (id) p3 
{ 
    NSMethodSignature *sig = [self methodSignatureForSelector:selector]; 
    if (!sig) 
     return nil; 

    NSInvocation* invo = [NSInvocation invocationWithMethodSignature:sig]; 
    [invo setTarget:self]; 
    [invo setSelector:selector]; 
    [invo setArgument:&p1 atIndex:2]; 
    [invo setArgument:&p2 atIndex:3]; 
    [invo setArgument:&p3 atIndex:4]; 
    [invo invoke]; 
    if (sig.methodReturnLength) { 
     id anObject; 
     [invo getReturnValue:&anObject]; 
     return anObject; 
    } 
    return nil; 
} 

(Zobacz NSObjectAdditions z projektu Three20.) Następnie możesz nawet rozszerzyć powyższą metodę, aby użyć varargs i tablicy argumentów zakończonych znakiem Nil, ale to przesada.

0

Dodatkową opcją, gdy trzeba wysłać wiele obiektów przy pomocy performSelector jest (jeśli jest to łatwe), aby zmienić metodę, którą chcesz wywołać, aby pobrać obiekt NSDictionary zamiast wielu parametrów, ponieważ będziesz w stanie wysłać dowolną liczbę osób w słowniku.

Na przykład

miałem sposób podobny do tego, który miał 3 argumenty i musiałem zadzwonić z performSelector -

-(void)getAllDetailsForObjectId:(NSString*)objId segment:(Segment*)segment inContext:(NSManagedObjectContext*)context{ 

zmieniłem tę metodę, aby skorzystać słownika do zapamiętywania argumenty

-(void)getAllDetailsForObject:(NSDictionary*)details{ 

dlatego udało mi się wywołać metodę łatwo

[self performSelector:@selector(getAllDetailsForObject:) withObject:@{Your info stored within a dictionary}]; 

Pomyślałem, że równie dobrze będę mógł to wykorzystać jako alternatywną opcję, która działa dla mnie.

Cheers

Powiązane problemy