Iphone 如何从类别中的重载函数调用原始函数?
在Objective-C中,我有一个类的类别: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的情
@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本身实现的,这意味着它“已经存在于类别的类中”。您需要对每个标签进行什么样的初始化?也许我们可以建议一个替代方案。(旁白)永远不要用类别覆盖苹果提供的类中的现有方法。您无法知道内部实现细节/依赖性可能是什么……这是个坏主意;危险的对于调试来说已经足够好了,但不要在生产代码中发布它,因为它最终会困扰您。您觉得它可能会导致什么问题?