2013-06-18 53 views
0

我目前正試圖利用forwardInvocation,但有一些麻煩。我想轉發ClassA調用一個有限的方法集到作爲屬性存儲在我的ClassA中的另一個實例(ClassB),但是我也希望在我的ClassA中有一個回退方法,如果方法未實現在ClassBforwardInvocation不轉發調用

不幸的是,我發現任何方法在ClassB上實現,總是調用ClassA方法!

我執行此操作的方式如下所示。任何人都可以提供任何關於我要出錯的建議嗎?

static NSSet *forwardMessages; 

@implementation ClassA 

@synthesize classBInstance; 

- (id) initWithDelegate:(id)delegate { 
    self = [super init]; 
    classBInstance = delegate; 
    return self; 
} 

+ (void) initialize { 
    if (self == [ClassA class]) { 
     forwardMessages = [[NSSet alloc] initWithObjects: 
         @"doSomething", 
         @"doSomethingElse", 
         @"anotherThing", 
         @"yetMoreThings", 
         nil]; 

- (BOOL) respondsToSelector:(SEL)aSelector { 
    return [super respondsToSelector:aSelector] || [self isHandledByDelegate:aSelector]; 
} 

- (BOOL) isHandledByDelegate:(SEL)aSelector { 
    return [forwardMessages containsObject:NSStringFromSelector(aSelector)] && 
      [classBInstance respondsToSelector:aSelector]; 
} 

- (void)forwardInvocation:(NSInvocation *)anInvocation 
{ 
    BOOL forwardThis = [self isHandledByDelegate: [anInvocation selector]]; 

    if (forwardThis) { 
     [anInvocation invokeWithTarget:classBInstance]; 
    } else { 
     [super forwardInvocation:anInvocation]; 
    } 
} 

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector { 
    Class handlingClass = [self isHandledByDelegate:aSelector]? [classBInstance class]:[self class]; 
    return [handlingClass instanceMethodSignatureForSelector:aSelector]; 
} 

- (void) doSomething { 
    // this should be forwarded to classBInstance but is always called! 
} 

回答

1

-forwardInvocation只有在被調用的類中不存在具有該簽名的方法時才被方法調度調用。如果您只是試圖在委託上調用方法(如果委託具有這些方法),但您希望在該類中使用默認實現,則不需要使用-forwardInvocation,只需使用覆蓋委派模式即可。

- (void)doSomething { 
    if ([delegate respondsToSelector: @selector(doSomething)]) { 
     [delegate doSomething]; 
     return; 
    } 
    // ... default behavior 
} 

如果你真的想用這種複雜的形式,它具有的方法列表來覆蓋,等等,你很可能會最終使用NSProxy的子類前端,並做出確定要調用哪個類,但似乎過於複雜,除非您無法訪問您正在嘗試填充的類。

+0

這就是答案。似乎回想起來很明顯。非常感謝! – majackson

相關問題