2012-11-15 9 views

risposta

3

per gestire l'eccezione "non riconosciuta selettore", dovremmo ignorare due metodi:

- (void)forwardInvocation:(NSInvocation *)anInvocation; 
- (NSMethodSignature*)methodSignatureForSelector:(SEL)selector; 

In questo caso, se vogliamo NSNull per eseguire il metodo NSSString se si verifica un'eccezione "non riconosciuta selettore", dovremmo fare this:

@interface NSNull (InternalNullExtention) 
@end 



@implementation NSNull (InternalNullExtention) 

- (NSMethodSignature*)methodSignatureForSelector:(SEL)selector 
{ 
    NSMethodSignature* signature = [super methodSignatureForSelector:selector]; 
    if (!signature) { 
     signature = [@"" methodSignatureForSelector:selector]; 
    } 
    return signature; 
} 

- (void)forwardInvocation:(NSInvocation *)anInvocation 
{ 
    SEL aSelector = [anInvocation selector]; 

    if ([@"" respondsToSelector:aSelector]) 
     [anInvocation invokeWithTarget:@""]; 
    else 
     [self doesNotRecognizeSelector:aSelector]; 
} 
@end 
1

C'è. Guarda l'esempio per forwardInvocation: nella documentazione per NSObject qui: https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html

Fondamentalmente si ignora forwardInvocation e che viene chiamato quando un oggetto non dispone di un metodo che corrisponde un dato selettore.

+0

Grazie! Ho notato inoltre - (void) forwardInvocation: (NSInvocation *) anInvocation, ho anche bisogno di implementare il - (NSMethodSignature *) methodSignatureForSelector: selettore (SEL) – Hang

3

È possibile utilizzare le categorie per aggiungere metodi alle classi NSNull e NSNumber. Leggi le categorie in The Objective-C Programming Language.

È possibile implementare methodSignatureForSelector: e forwardInvocation: per gestire qualsiasi messaggio senza definire esplicitamente tutti i messaggi che si desidera gestire. Leggi di loro nel NSObject Class Reference.

+0

Awesome! Trovato risolto :) Grazie! – Hang