【问题标题】:Objective-C Runtime: How to remove a method from a class?Objective-C 运行时:如何从类中删除方法?
【发布时间】:2011-10-29 23:54:20
【问题描述】:

Objective-C Runtime Reference 中,我看到了class_addMethod,但没有看到class_removeMethod。如何动态删除方法?

另外,class_addMethod是添加实例方法还是类方法?

【问题讨论】:

标签: objective-c-runtime


【解决方案1】:

正如 Inerdial 在他的评论中提到的,主要问题(如何在运行时从类中删除方法?)在here 中得到了详尽的回答。

MattDiPasquale 也问:

还有,class_addMethod是添加实例方法还是类方法?

Inerdial 再次正确:

class_addMethod 添加一个实例方法,而要添加一个类方法,你需要在该类的类中添加一个实例方法。

给定一个 c,我们可以像

一样简单地掌握它是实例的类(称为“元类”)
Class metac = object_getClass(c);

然后为c“添加一个类方法”,我们使用class_addMethod向metac添加一个方法。

例如,如果我们已经在其他地方定义了

id myClassMethodImplementation(id self, SEL _cmd) {
    //implementation
}

然后我们可以向 c 添加一个类方法如下:

BOOL success = class_addMethod(metac, @selector(myClassMethod), (IMP)myClassMethodImplementation, "@@:");

或等效

BOOL success = class_addMethod(object_getClass(c), @selector(myClassMethod), (IMP)myClassMethodImplementation, "@@:");

要在 c 上简单地添加与 instance 方法相同的方法,我们只需编写

BOOL success = class_addMethod(c, @selector(myClassMethod), (IMP)myClassMethodImplementation, "@@:");

参考资料: 1.Objective-C Runtime Reference 2.Objective-C Runtime Programming Guide - Type Encodings 3.Cocoa with Love - What is a meta-class in Objective-C?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多