1. 程式人生 > >【IOS學習】訊息轉發和它的實際應用

【IOS學習】訊息轉發和它的實際應用

訊息轉發,適用於把操作給另外一個類來實現

-(NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
{
    NSMethodSignature *signature = [super methodSignatureForSelector:aSelector];
    if (!signature) {
        signature = [self.displayLabel methodSignatureForSelector:aSelector];
    }
    return signature;
}

-(void)forwardInvocation:(NSInvocation *)anInvocation
{
    SEL selector = [anInvocation selector];
    if ([self.displayLabel respondsToSelector:selector]) {
        [anInvocation invokeWithTarget:self.displayLabel];
    }
}
上例中,一個UIViewController包含了UIlable 屬性 displayLabel, 如果UIViewController 例項呼叫[instance setText:@"string"]方法,由於類沒有實現setText:方法,通過上面兩行程式碼,將會轉發,由 displayLabel 實現。

另:訊息轉發的使用,下面的類別拓展解決了對NSNull物件操作導致的崩潰(在網路資料返回為空的時候經常遇到)

- (NSMethodSignature*)methodSignatureForSelector:(SEL)selector
{
    NSMethodSignature* signature = [super methodSignatureForSelector:selector];
    if (!signature) {
        for (NSObject *object in NSNullObjects) {
            signature = [object methodSignatureForSelector:selector];
            if (signature) {
                break;
            }
        }
        
    }
    return signature;
}

- (void)forwardInvocation:(NSInvocation *)anInvocation
{
    SEL aSelector = [anInvocation selector];
    
    for (NSObject *object in NSNullObjects) {
        if ([object respondsToSelector:aSelector]) {
            [anInvocation invokeWithTarget:object];
            return;
        }
    }
    
    [self doesNotRecognizeSelector:aSelector];
}