關(guān)于多重代理源碼 粘貼在一個(gè).m里即可,原文及其用法如:原文
@interface MultipleDelegateProxy ()
@property (nonatomic, strong) NSPointerArray *weakRefTargets;
@end
@implementation MultipleDelegateProxy
- (void)setDelegateTargets:(NSArray *)delegateTargets{
self.weakRefTargets = [NSPointerArray weakObjectsPointerArray];
for (id delegate in delegateTargets) {
[self.weakRefTargets addPointer:(__bridge void *)delegate];
}
}
- (BOOL)respondsToSelector:(SEL)aSelector{
if ([super respondsToSelector:aSelector]) {
return YES;
}
for (id target in self.weakRefTargets) {
if ([target respondsToSelector:aSelector]) {
return YES;
}
}
return NO;
}
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector{
NSMethodSignature *sig = [super methodSignatureForSelector:aSelector];
if (!sig) {
for (id target in self.weakRefTargets) {
if ((sig = [target methodSignatureForSelector:aSelector])) {
break;
}
}
}
return sig;
}
//轉(zhuǎn)發(fā)方法調(diào)用給所有delegate
- (void)forwardInvocation:(NSInvocation *)anInvocation{
for (id target in self.weakRefTargets) {
if ([target respondsToSelector:anInvocation.selector]) {
[anInvocation invokeWithTarget:target];
}
}
}