【发布时间】:2015-11-13 11:34:35
【问题描述】:
我经常这样使用协议:
@protocol AnotherObjectDelegate <NSObject>
-(void)someMethodWithObject:(id)object;
@end
@interface AnotherObject : NSObject
@property (assign) id<AnotherObjectDelegate> delegate;
@end
我的 BaseObject 确实符合该协议,并且也是接收来自 AnotherObject 的消息的委托。
@interface BaseObject : NSObject <AnotherObjectDelegate>
@property AnotherObject* anotherObject;
@property SecondLevelObject* secondLevelObject;
@end
@implementation BaseObject
-(instancetype)init {
if (self = [super init]) {
self.anotherObject = [AnotherObject new];
self.anotherObject.delegate = self;
}
}
-(void)someMethodWithObject:(id)object {
// Forwarding Message from Delegate to other Object conforming to protocol:
[self.secondLevelObject someMethodWithObject:object];
}
@end
然而,BaseObject-Instance 充当某种代理,让其他实例将协议消息转发到 BaseObject 之后的对象所拥有的其他对象:
@interface SecondLevelObject : NSObject <AnotherObjectDelegate>
@property ThirdLevelObject* thirdLevelObject;
@end
@implementation SecondLevelObject
-(void)someMethodWithObject:(id)object {
[self.thirdLevelObject someMethodWithObject:object];
}
@end
在 SecondLevelObject 中有一个 ThirdLevelObject 也符合相同的协议。在这里,我还转发了消息 - 因此 SecondLevelObjects 也充当某种代理。
@interface ThirdLevelObject : NSObject <AnotherObjectDelegate>
@end
@implementation ThirdLevelObject
-(void)someMethodWithObject:(id)object {
// Finally it's here
}
@end
我使用这种类设计是为了防止使用长指针链,例如:
anotherObject.delegate = baseObject.secondLevelObject.thirdLevelObject;
并防止我的类有太多弱/分配引用,当您有多个符合多个协议的对象时,这些引用可能难以调试。
其中一个缺点是我必须在每个用作“代理”来转发消息的类中添加那些类似于样板代码的协议实现。即使 - 在我的情况下 - 这更容易阅读和调试。
所以我问自己是否有更简单的方法来做到这一点。我也这样做是为了防止我的代码调用
if ([delegate respondsToSelector:@selector(someMethod)]
[delegate someMethod];
这里有什么可以帮助我的 Objective-C 运行时函数吗?
【问题讨论】:
标签: objective-c cocoa protocols