关于问题Multiple delegates per one object?其中一个答案提出了有趣的解决方案(至少对于我天真的眼睛):创建一个“委托拆分器”,允许一个对象(在本例中为UIScrollView)有多个委托(在这种情况下UIScrollViewDelegate)。
代码如下:
@interface DelegateSplitter : NSObject
-(void)addDelegate:(id)delegate;
-(void)addDelegates:(NSArray*)array;
@end
@interface DelegateSplitter()
@property NSMutableSet *delegates;
@end
@implementation DelegateSplitter
-(id)init
{
self = [super init];
_delegates = [NSMutableSet set];
return self;
}
-(void)addDelegate:(id)delegate
{
[_delegates addObject:delegate];
}
-(void)addDelegates:(NSArray *)array
{
[_delegates addObjectsFromArray:array];
}
-(void)forwardInvocation:(NSInvocation *)anInvocation
{
for (id delegate in _delegates)
{
if([delegate respondsToSelector:anInvocation.selector])
{
[anInvocation invokeWithTarget:delegate];
}
}
}
- (NSMethodSignature*) methodSignatureForSelector: (SEL) selector
{
NSMethodSignature *our = [super methodSignatureForSelector:selector];
NSMethodSignature *delegated = [[_delegates anyObject]
methodSignatureForSelector:selector];
return our ? our : delegated;
}
- (BOOL) respondsToSelector: (SEL) selector
{
return [[_delegates anyObject] respondsToSelector:selector];
}
此代码的问题在于它创建了保留周期,与普通委托不同,您无法将其声明为
@property (assign) DelegateSplitter *splitter;
它看起来似乎是一个比包装器“更好”的解决方案。那么无论如何都要避免保留周期?
答案 0 :(得分:1)
您需要多少代表,只需为其中3个代表制作一个属性,如果您需要更多代表,则需要从根本上重新设计您的应用...
更好的方法是为每个活动,视图委托,数据源和一些异步网络委托等设置委托......如果它们最终成为同一个对象,谁在乎......它将工作。