ios 目标C:声明选择器但在对象类别中实现它

wtlkbnrh  于 2023-02-14  发布在  iOS
关注(0)|答案(1)|浏览(111)

我在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中是不可能的

hwazgwia

hwazgwia1#

如果可能的话,我强烈建议对你的对象使用a delegate pattern,这样调用者就可以传递一个符合协议的委托,而不是直接扩展类。这是实现这种系统的正常方式。但是如果有特殊的原因,委托是不可能的,你可以构建你所描述的。
您要寻找的是informal protocol,在引入@optional之前,几乎所有协议都是这样处理的。
你要做的是在你的类的公共头中定义一个类别:

@interface Framework (OverridePoints)
- (void)methodToBeImplemented
@end

这声明了这样一个方法可能存在,但它并不强制它实际上被实现。关键是在括号中有一个名称。这可以是任何内容(我在这里使用了“OverridePoints”),但不能为空,因为这将是一个扩展而不是一个类别。
一旦你有了这些,你的其他想法就可以实现了,你可以测试respondsToSelector:,消费者可以实现(或者不实现)你描述的分类方法。
一个危险是,没有什么可以阻止程序的多个部分按类别实现同一个方法,这是未定义的行为,但编译器不会为您捕获它。

相关问题