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

Maz*_*yod 5 overriding objective-c

我不知道如何把这个,我找不到答案,因为我无法找到表达我们正在寻找的词.(!)

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

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

但是,我无法在Objective-C中找到如何做到这一点.我在搜索中发现的是类别和奇怪的^ {}符号......

那么,如何覆盖新创建的对象中的方法呢?

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

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

编辑:

显然,没有子类化:)

编辑:

如果有人有更好的想法,也可以发布我的问题:

我在COCOS2D中有一些CCTransition,我希望在转换结束时得到通知.事情是,一旦转换结束, - (void)完成; 调用方法(这是CCTransition类结构的一部分)

我真的想避免继承CCTransition类,并在转换结束时覆盖finish方法来执行我的逻辑:)

编辑:

- (无效)onEnterTransitionDidFinish; ......我不敢相信那些存在的东西,我在搜索时没有遇到它......

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

Tom*_*mmy 7

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

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

method_setImplementation(methodToReplace, implementationToSet);
Run Code Online (Sandbox Code Playgroud)

相关的参考文档是Objective-C运行时参考,也可以是NSObject类参考(因为它使一些事情略微整洁,但是例如你可以class_getInstanceMethod从运行时使用而不是instanceMethodSigntureForSelector:).

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

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


Dan*_*son 2

Java 中有一个匿名子类。这在 Objective-C 中是不可能的(嗯,它有点像,但你必须使用 Obj-C 运行时库做一些相当复杂的扭曲)。

但从 iOS 4 或 OS X 10.6 开始,Objective-C 有“块”,这就是^{}语法的用途。这就是 Objective-C 的闭包概念。如果您调用的 API 不支持块回调,这不会直接帮助您,但您可以创建使用块而不是子类方法来处理回调的包装类。

许多资源可用于学习 Objective-C 中的块。