转发对外部 -init 方法的调用

Forwarding call to foreign -init method

情况

对于我的一个项目,我正在构建某种扩展。此扩展必须有一个 class 来实现声明为 - (id)initWithBundle:(NSBundle *)bundle 的方法。

问题

我的扩展程序有多个 classes,但主机应用程序写得非常糟糕,以至于它在不同的 classes 上随机调用 - (id)initWithBundle:(NSBundle *)bundle

我不愿意减少 classes 的数量,所以剩下的唯一解决方案就是以某种方式转发给实际实现 - (id)initWithBundle:(NSBundle *)bundle 的 class 的调用者(有点像 HTTP 302)。我找到了很多关于转发呼叫的资源,但没有找到诸如转发 -init 方法之类的资源...

init 被允许 return 除了自身以外的对象。虽然我强烈建议修复调用代码(我无法想象允许调用任何东西的代码 "randomly" 甚至是一个合理的想法),但如果你想 return 来自 [=] 的其他对象11=],它是这样工作的:

- (id)initWithBundle:(NSBundle *)bundle {
    // I don't actually implement this, let's return the class that does
    return [[OtherClass alloc] initWithBundle: bundle];
}

ARC 会处理把你扔掉的问题。

调用者当然有错误的类型(他们期望你的类型,并且他们有一些其他随机对象),这很可能导致 hijinks,很难跟踪错误,以及普遍的悲伤。但这是合法的 ObjC。如果这两个 类 的方法有足够的重叠,它甚至可能有效。

在正常情况下,这种模式称为 Class 簇。有关示例,请参阅 What exactly is a so called "Class Cluster" in Objective-C?