gpt4 book ai didi

ios - 一个对象有多个委托(delegate)? (跟进)

转载 作者:行者123 更新时间:2023-11-29 03:55:33 26 4
gpt4 key购买 nike

关于问题Multiple delegates per one object?其中一个答案提出了有趣的解决方案(至少对于我天真的眼睛来说):创建一个“委托(delegate)拆分器”,允许一个对象(在本例中为 UIScrollView)拥有多个委托(delegate)(在本例中为 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];
}

此代码的问题在于它会创建保留循环,并且与普通委托(delegate)不同,您不能将其声明为

@property (assign) DelegateSplitter *splitter;

然而,它看起来确实是比包装器“更好”的解决方案。那么有没有办法避免保留周期呢?

最佳答案

您需要多少个代表,只需为其中 3 个代表创建一个属性,如果您需要更多,那么您需要从根本上重新设计您的应用程序...

更好的方法是为每个事件提供一个委托(delegate)、一个 View 委托(delegate)、一个数据源和一些异步网络委托(delegate)等...如果它们最终是同一个对象,谁在乎...它会只是工作。

关于ios - 一个对象有多个委托(delegate)? (跟进),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16544284/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com