Iphone 如何从类别中的重载函数调用原始函数?

Iphone 如何从类别中的重载函数调用原始函数?,iphone,objective-c,cocoa,categories,overloading,Iphone,Objective C,Cocoa,Categories,Overloading,在Objective-C中,我有一个类的类别: @interface UILabel(CustomInit) - (id)initWithCoder:(NSCoder *)coder; @end 我要做的是编写一个自定义init函数来做一些额外的事情,我想做的是,在这个自定义init函数中,调用UILabel的base initWithCoder。这可能吗?怎么会这样 编辑 谢谢。好的,所以我的计划没有意义。不能用编码器重载init。有没有一种方法可以在不重载initWithCoder的情

在Objective-C中,我有一个类的类别:

@interface UILabel(CustomInit)

- (id)initWithCoder:(NSCoder *)coder;

@end
我要做的是编写一个自定义init函数来做一些额外的事情,我想做的是,在这个自定义init函数中,调用UILabel的base initWithCoder。这可能吗?怎么会这样

编辑

谢谢。好的,所以我的计划没有意义。不能用编码器重载init。有没有一种方法可以在不重载initWithCoder的情况下实现相同的功能(所有UILabel都获得了这个添加的初始化步骤)?或者,是否有UILabel的initWithCoder的示例代码,我可以用添加的代码重写

编辑

好的,为了弄清楚我在尝试什么:

有一个答案,其中有人使用专用GraphicsServices函数GSFontAddFromFile在iphone上手动添加自定义字体。我尝试了这段代码,它非常适合手动设置标签的字体。但是,如果您尝试在Interface Builder中设置字体,它不会正确加载,它只会下降到系统字体。我想做的是手动加载字体,并用IB中选择的字体自动设置标签的字体。这样我就不需要为我放下的每个标签设置出口。我也不必写一个可笑的label子类(这也是在那个线程中建议的,并且做了大量的自定义绘图),我发现它相当怪异。现在我仍然可以为我的所有标签创建一个子类,但是在其他UI对象(即UIButtons)中也有嵌入标签的情况。我希望嵌入的标签也不要被破坏

任何建议都很好。谢谢。

来自:

当类别覆盖继承的 方法,类别中的方法 可以像往常一样调用继承的 通过向超级用户发送消息来实现。 但是,如果类别覆盖了 方法,该方法已存在于 类别的类,无法 调用原始实现


你们对此有何感想

在运行时获取initWithCoder的原始方法地址,并将其存储在静态变量中。对它执行一个方法swizzle,用my initWithCoder替换类实现。然后在initWithCoder中,调用存储在静态变量中的原始方法

您可以将它放在一个类别中,并在程序开始时调用这个类初始化步骤,确保它不能被调用两次,或者如果是,它什么也不做


这似乎很危险,但我觉得它应该有效。

方法swizzling应该像Kindamedlox建议的那样有效

埃文·多尔(Evan Doll)在斯坦福itunes课程中讨论了你的问题


我在您的答案中添加了一些重点,我将在这里添加
initWithCoder:
肯定是由UILabel本身实现的,这意味着它“已经存在于类别的类中”。您需要对每个标签进行什么样的初始化?也许我们可以建议一个替代方案。(旁白)永远不要用类别覆盖苹果提供的类中的现有方法。您无法知道内部实现细节/依赖性可能是什么……这是个坏主意;危险的对于调试来说已经足够好了,但不要在生产代码中发布它,因为它最终会困扰您。您觉得它可能会导致什么问题?