对于我的一个项目,我正在构建某种扩展。此扩展必须具有一个实现声明为- (id)initWithBundle:(NSBundle *)bundle
的方法的类。
我的扩展程序有多个类,但是主机应用程序编写得非常糟糕,以至于它随机地在不同的类上调用- (id)initWithBundle:(NSBundle *)bundle
。
我不愿意减少类的数量,因此剩下的唯一解决方案是以某种方式将调用方转发给实际实现- (id)initWithBundle:(NSBundle *)bundle
的类(有点像HTTP 302)。我在转发呼叫时找到了很多资源,但没有转发-init方法......
答案 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?。