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

时间:2009-10-03 20:02:10

标签: iphone objective-c cocoa categories overloading

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

@interface UILabel(CustomInit)

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

@end

我正在做的是编写一个自定义初始化函数来执行一些额外的操作,而我想做的是,在这个自定义初始化函数中,调用UILabel的基本initWithCoder。这可能吗?怎么样?

修改

感谢。好的,所以我的计划没有实际意义。不能只是重载initWithCoder。有没有办法实现相同的功能(所有UILabel获得这个添加的初始化步骤)而不会重载initWithCoder?或者也许是UILabel的initWithCoder的示例代码,我可以用添加的代码重写它?

修改

好的,所以要清楚我正在尝试的事情:

Can I embed a custom font in an iPhone application?

有一个答案,其中有人使用私人GraphicServices函数GSFontAddFromFile手动在iphone上添加自定义字体。我尝试了这个代码,它非常适合手动设置标签的字体。但是,如果您尝试在Interface Builder中设置字体,它无法正确加载,它只是下拉到系统字体。我想要做的是手动加载字体并使用IB中选择的字体自动设置标签的字体。这样我就不需要为我放下的每个标签打造一个插座。我也没有必要编写一个荒谬的标签子类(也在该线程中提出并进行了大量的自定义绘图),我发现它非常怪诞。现在我仍然可以为我的所有标签创建一个子类,但是在其他UI对象中就是嵌入标签的情况,即UIButtons。我希望嵌入式标签也不会被破坏。

任何建议都会很棒。感谢。

3 个答案:

答案 0 :(得分:13)

来自Mac OS X Reference Library

  

当某个类别覆盖继承时   方法,类别中的方法   像往常一样,可以调用继承的   通过消息实现到超级。   但是,如果某个类别覆盖了   方法已经存在于   类别的类,没有办法   调用原始实现。

答案 1 :(得分:1)

你们对此感觉如何?

在运行时获取initWithCoder的原始方法地址并将其存储在静态变量中。做一个方法混杂在它上面用我的initWithCoder替换类实现。然后在我的initWithCoder中,我将调用存储在静态变量中的原始方法。

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

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

答案 2 :(得分:1)

方法调整应该像kidnamedlox建议的那样工作。

Evan Doll在这个stanford itunes课程中讨论了完全相同的问题

http://deimos3.apple.com/WebObjects/Core.woa/Browse/itunes.stanford.edu.2024353965.02024353968.2173787533?i=1949208242