objective-c - 覆盖单个对象实例中的方法

标签 objective-c overriding

我不确定如何表达,而且我无法找到答案,因为我找不到合适的词来表达我正在寻找的东西。 (!)

在Java中,我曾经做过这样的事情(我不记得了):

JPanel myButton = new JPanel("Press me"){
    public void add(JComponent component){
        //override add method
    }
};

但是,我找不到如何在 Objective-C 中执行此操作。我在搜索中发现的是类别和奇怪的 ^{} 符号 ...

那么,我怎样才能覆盖新创建的对象中的方法?

(例如,在新创建的 NSString* 中覆盖 -(BOOL)isEqual; ?)

很抱歉,如果问题有点含糊..

编辑:

显然,没有子类化:)

编辑:

不妨发布我的问题,以防有人有更好的主意:

我在 COCOS2D 中有几个 CCTransitions,我想在转换结束时得到通知.. 事情是,一旦转换结束,-(void)finish;方法被调用(它是 CCTransition 类结构的一部分)

我真的想避免子类化 CCTransition 类,并重写 finish 方法以在转换结束时执行我的逻辑:)

编辑:

-(void)onEnterTransitionDidFinish; ...我不敢相信有这么棒的东西存在,而且我在搜索时还没有遇到过它......

这意味着,不是子类化 CCTransition,而是在我的 CCNode 子类中重写这个方法 :D!

最佳答案

它仍然不会很干净,但假设你愿意集中丑陋,你可以做类似的事情(未经测试):

Method methodToReplace =
          [targetClass instanceMethodSignatureForSelector:@selector(methodToReplace)];
IMP implementationToSet =
          [someProxyClass instanceMethodForSelector:@selector(implementationYouWant)];

method_setImplementation(methodToReplace, implementationToSet);

相关引用文档是Objective-C Runtime Reference并且,可选地,NSObject Class Reference (因为它使一些事情稍微更整洁,尽管例如您可以在运行时使用 class_getInstanceMethod 而不是 instanceMethodSigntureForSelector:)。

请注意,如果您完全使用该配方,您将无法调用原始实现。 method_setImplementation 返回旧的实现,通常明智的做法是将其添加到全新选择器下的类中并改为调用它。

作为引用,我有正当理由只做一次这种事情:当我们在一个 iOS 应用程序中实现打印支持时,它需要与 OS 3.2 和 4.0 兼容。您需要对特定类进行子类化,但该类在 3.2 中不可用。所以你有点必须在运行时子类化(尽管概念上更简洁的方法是使用普通子类,将其放入框架和弱链接中,但 Apple 的 iOS SDK 条款仅允许静态库,所以......)。

关于objective-c - 覆盖单个对象实例中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6214150/

相关文章:

c - 是否可以在 C 中重载运算符?

ios - 标签后面的移动图像

ios - 我们什么时候使用saveAccount :(ACAccount *)account of ACAccountStore class?

ios - 如何通过 AFNetworking 和 NSUrlSession 调用 SOAP Web 服务

vb.net - 我可以覆盖接口(interface)属性吗?

c++ - 非重写虚函数的绑定(bind)类型

objective-c - 在 Cocoa 应用程序中默认为全屏?

objective-c - objective-c /c : Detect USB drive via IOKit only on Mac

javascript - 覆盖 JavaScript 中比较运算符的默认行为

go - 在 golang 中,如何覆盖嵌入式结构的方法