我在obj-c中有一个框架,它被其他模块包含了,我想允许将要包含它的模块为某些方法提供自己的实现。
我不能使用子类化,因为在序列化这些对象时有一些问题。所以,必须依赖于使用类别。
我想为对象声明一个方法/选择器,然后模块将定义类别并实现该方法。
Framework will declare interface like below:
@interface framework:NSObject
- (void)methodToBeImplemented;
@end
@implementation framework()
- (void)invokeClientDefinedMethod
{
if([self respondsToSelector:@(methodToBeImplemented)]) {
[self methodToBeImplemented];
}
}
//Module-1 will link against this framework and define the category
@implementation framework(methodImplementor)
- (void)methodToBeImplemented
{
...
}
@end
我可以选择在模块本身提供的框架和实现中完全不实现methodToBeImplemented
吗?我知道我可以通过performSelector
路径实现它。但我害怕这样做,因为我想发送指向我的方法的指针,这在performSelector
中是不可能的
1条答案
按热度按时间hwazgwia1#
如果可能的话,我强烈建议对你的对象使用a delegate pattern,这样调用者就可以传递一个符合协议的委托,而不是直接扩展类。这是实现这种系统的正常方式。但是如果有特殊的原因,委托是不可能的,你可以构建你所描述的。
您要寻找的是informal protocol,在引入
@optional
之前,几乎所有协议都是这样处理的。你要做的是在你的类的公共头中定义一个类别:
这声明了这样一个方法可能存在,但它并不强制它实际上被实现。关键是在括号中有一个名称。这可以是任何内容(我在这里使用了“OverridePoints”),但不能为空,因为这将是一个扩展而不是一个类别。
一旦你有了这些,你的其他想法就可以实现了,你可以测试
respondsToSelector:
,消费者可以实现(或者不实现)你描述的分类方法。一个危险是,没有什么可以阻止程序的多个部分按类别实现同一个方法,这是未定义的行为,但编译器不会为您捕获它。