转发调用外部-init方法

时间:2015-08-07 20:58:54

标签: objective-c objective-c-runtime nsinvocation

场合

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

问题

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

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

1 个答案:

答案 0 :(得分:1)

允许

init返回除自身以外的对象。虽然我强烈建议修复调用代码(我无法想象允许代码调用任何“随机”的情况甚至是一个合理的想法),如果你想从init返回一些其他对象,它的工作原理像这样:

- (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。如果这两个类的方法有足够的重叠,它甚至可能会起作用。

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