转发对外部 -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?。
情况
对于我的一个项目,我正在构建某种扩展。此扩展必须有一个 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?。