Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如果我重写一个类方法,有没有办法调用原始方法(被重写的方法)?_Iphone_Objective C_Ipad_Ios - Fatal编程技术网

Iphone 如果我重写一个类方法,有没有办法调用原始方法(被重写的方法)?

Iphone 如果我重写一个类方法,有没有办法调用原始方法(被重写的方法)?,iphone,objective-c,ipad,ios,Iphone,Objective C,Ipad,Ios,在Objective-C中,如果我使用一个类别重写一个类方法,有没有办法调用原始方法(被重写的方法)? 看起来不可能 当一个类别重写继承的方法时,该类别中的方法可以像往常一样,通过发送给super的消息调用继承的实现。但是,如果类别重写了类别类中已经存在的方法,则无法调用原始实现 这对我来说意味着,如果你通过一个类别覆盖子类上的一个方法,你可以像平常一样调用[super methodName],但是如果你直接覆盖基类方法,你就不能调用原始方法 如果动态提供类别覆盖(请参见resolveInsta

在Objective-C中,如果我使用一个类别重写一个类方法,有没有办法调用原始方法(被重写的方法)?

看起来不可能

当一个类别重写继承的方法时,该类别中的方法可以像往常一样,通过发送给super的消息调用继承的实现。但是,如果类别重写了类别类中已经存在的方法,则无法调用原始实现


这对我来说意味着,如果你通过一个类别覆盖子类上的一个方法,你可以像平常一样调用[super methodName],但是如果你直接覆盖基类方法,你就不能调用原始方法

如果动态提供类别覆盖(请参见resolveInstanceMethod:),则可以预先缓存以前的方法选择器,并调用它。

+(void)load
中,我为您提供了三种方法。在任何情况下,请将您的方法命名为MyCategory\u方法或其他名称

  • 类_getMethodImplementation()和类_replaceMethod()。存储旧的IMP,并直接调用它。您需要获取方法的类型编码。请注意,您也可以使用普通的C函数
  • 类\u getInstanceMethod()、方法\u getImplementation()、方法\u setImplementation()。如上所述,但不需要获取方法的类型编码
  • 在这两个方法上初始化\u getInstanceMethod(),然后在方法\u ExchangeImplements()上初始化。调用MyCategory_方法以获取原始实现。这是最简单的方法
有时候,这是让它做你想做的事情的唯一合理的简单方法


编辑:并且只有在您知道自己在做什么的情况下才能执行此操作

这是可能的,但不是不喝。但是,不要那样做。最终,它会带来比解决问题更多的问题说真的,谢谢你的帮助!