首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从imp调用Objective-C方法

从imp调用Objective-C方法,需要使用Objective-C的运行时库(Runtime Library)。以下是一个简单的示例,展示了如何从imp调用Objective-C方法:

代码语言:objective-c
复制
#import<Foundation/Foundation.h>
#import <objc/runtime.h>

@interface MyClass : NSObject
- (void)myMethod;
@end

@implementation MyClass
- (void)myMethod {
    NSLog(@"myMethod called");
}
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        MyClass *obj = [[MyClass alloc] init];
        Method method = class_getInstanceMethod([MyClass class], @selector(myMethod));
        IMP imp = method_getImplementation(method);
        void (*func)(id, SEL) = (void *)imp;
        func(obj, @selector(myMethod));
    }
    return 0;
}

在这个示例中,我们首先定义了一个名为MyClass的类,并实现了一个名为myMethod的方法。然后,我们使用class_getInstanceMethod函数获取了myMethod方法的Method结构体,接着使用method_getImplementation函数获取了myMethod方法的IMP结构体。最后,我们将IMP结构体转换为一个函数指针,并使用该函数指针调用myMethod方法。

需要注意的是,由于Objective-C的运行时库是苹果公司提供的,因此在使用上述代码时,需要使用苹果公司的编译器和运行时库。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

objective-C 的OOP(上)--类定义、继承及方法调用

上一篇展示了如何用传统的“面向过程编程方法”,实现画“矩形”、“圆”、“椭圆”,这一篇看下如何改用OOP的方法来实现: 因为要用到“颜色”以及“矩形区域”二个枚举,先把他们抽出来单独放在CommDef.h...setBounds:(ShapeRect)b { bounds = b; } - (void) setFillColor:(ShapeColor)f { fillColor =f; } //注:这个方法留给子类去实现...All rights reserved. // #import "Shape.h" //注:因为Circle类不需要扩展其它方法,所以这里也只要一个空壳 @interface Circle : Shape...bounds.x,bounds.y,bounds.width,bounds.height,[super getColorName:fillColor]); } @end 注:上面展示了在obj-C中如何调用父类的方法...%d) in %@",bounds.x,bounds.y,bounds.width,bounds.height,[super getColorName:fillColor]); } @end 最后看下调用的主函数

1.2K80

如何符号化Objective-C调用栈如何符号化Objective-C调用

1)atos工具(Xcode安装时一般会自带) (2)确认app运行的架构(armv7、arm64) (3)app对应的dSYM文件(出包时获得) (4)app代码载入到内存的基地址(后文详细介绍) 方法...2)确认app运行的架构(armv7、arm64) (2)该OS版本、该动态库的符号文件(将该手机连接到电脑的Xcode上,会自动同步系统符号文件) (3)该动态库载入到内存的基地址(后文详细介绍) 方法...sendAction:to:from:forEvent:] (in UIKit) + 96 如何获取基地址 注意:基地址在进程每次启动时决定,所以重启进程后,符号化时必须使用当次启动的基地址 方案一:iOS...crash日志中的下半部分,有这样的一些信息: 蓝色框圈出来的部分,即为app代码载入到内存的基地址 红色框圈出来的部分,即为各个动态库载入到内存的基地址 方案二:在app运行时打印 可以在app中调用如下代码获取各个

82610
  • objective-C中的Class(类类型),Selector(选择器SEL),函数指针(IMP)

    今天在园子里看到了一篇牛文“Objective-C 2.0 with Cocoa Foundation--- 5,Class类型,选择器Selector以及函数指针 ”,讲得十分精彩,忍不住把它的代码加上注释整理于此...而选择器SEL与函数指针IMP,如果非要跟c#扯上关系的话,这二个结合起来,就点类似c#中的反射+委托,可以根据一个方法名称字符串,直接调用方法。..."setSkinColor" { [aCattle performSelector:skin withObject:color];//则调用setSkinColor方法 } else...//IMP setSkinColor_Func = [cattle[1] methodForSelector:skin]; //用第二种方法取得saySomething的函数指针 say_Func...; //调用saySomething方法 say_Func(cattle[1],say); } @end 测试主函数main() #import <Foundation/Foundation.h

    1.8K51

    runtime的那些事(一)——runtime基础介绍

    runtime 是一套用C语言提供的 API,Objective-C 代码最终都会被编译器转化为运行时代码,通过消息机制决定了不同函数调用或转发方式,因此 runtime成为了 Objective-C...代码通过 runtime 的C函数转化后,可以发现: 所有的 Objective-C 方法调用都会在编译时转化成C函数 objc_msgSend 的调用 objc_msgSend 方法一定会有两个参数:...当以上两步没问题后,将开始查找该类的 IMP,默认先从 cache 中寻找,若命中则执行对应的方法 4. 若 cache 中无法命中,则会尝试方法列表 methodLists 中寻找 5....,最常用的,就是对象、类去调用一个未添加 IMP 实现的方法,去查看消息机制转发执行的过程。...,这个流程其实是寻找 IMP 的过程;若没有找到,就会进入动态解析流程; 第二次,下面红色边框中的信息,发现了消息转发相关方法的执行动作,也就是说第二次时消息转发过来的,意味着第一次动态解析失败了。

    1.5K20

    深入浅出 Runtime(一):初识

    但是编译器会将 string当作NSString的实例,所以string对象调用NSString的方法,编译没有任何问题,而调用NSMutableArray的方法,编译会直接报错。...Objective-C 程序在三个不同的级别上与 Runtime 系统进行交互 通过 Objective-C 源代码; 通过 Foundation 框架中 NSObject 类定义的方法,如: // 根据...IMP - (IMP)methodForSelector:(SEL)sel + (IMP)methodForSelector:(SEL)sel 通过直接调用 Runtime 函数,如: 类相关 //...(Method m, IMP imp) void method_exchangeImplementations(Method m1, Method m2) // 拷贝方法列表(最后需要调用 free...imp, const char *types) // 获取方法的相关信息(带有 copy 的需要调用 free 去释放) SEL method_getName(Method m) IMP method_getImplementation

    1K20

    iOS RunTime之二:数据结构

    Class 源文件看出,Objective-C的对象就是一个包含isa指针的数据结构,而isa指针的数据类型是Class,Class表示对象所属的类。 ?...元类(Meta Class) 在Objective-C中,所有的类自身也是一个对象,这个对象里面也有一个isa指针,它指向metaClass(元类),向这个对象发送消息(即调用方法)。 ?...IMP IMP就是implementation的缩写,本质就是一个函数指针,这个被指向的函数包含一个接收消息的对象id,调用方法的SEL,以及一些方法参数,并返回一个id。...因此我们可以通过SEL获得它所对应的IMP,在取得了函数指针之后,也就意味着我们取得了需要执行方法的代码入口,这样我们就可以像普通的C语言函数调用一样使用这个函数指针。 ?...Paste_Image.png SEL就是为了查找方法的最终实现IMP的,由于每个方法对应唯一的SEL,因此我们可以通过SEL方便快速准确地获得它所对应的IMP

    57420

    iOS 小技能:Method Swizzling (交换方法IMP

    前言 利用Objective-C Runtimee的动态绑定特性,将一个方法的实现与另一个方法的实现进行交换。...交换两个方法的实现一般写在分类的load方法里面,因为load方法会在程序运行前加载一次,而initialize方法会在类或者子类在 第一次使用的时候调用,当有分类的时候会调用多次。...不要在load里面取加载对象,因为我们再load调用的时候根本就不确定我们的对象是否已经初始化了,所以不要去做对象的初始化 I Method Swizzling基础 在Objective-C的Runtime...在Objective-C调用一个方法,其实是向一个对象发送消息,查找消息的唯一依据是selector的名字。因此我们可以在运行时偷换selector对应的方法实现,达到给方法挂钩的目的。...main之前,并且不需要我们初始化,+load`方法是在类或者类别被加载到Objective-C时执行。

    1.7K10

    Spring杂谈 | 桥接方法到JVM方法调用

    ,编译器会自动为我生成桥接方法,因为编译的后文件是交由JVM执行的,生成的这个桥接方法肯定就是为了JVM进行方法调用时服务的,我们不妨大胆猜测,在这种情况下,是因为JVM在进行方法调用时,没有办法满足我们的运行时多态...要弄清楚这个问题,我们还是要从JVM的方法调用说起。 JVM是怎么调用方法的? 我们应该知道,JVM要执行一个方法时必定需要先找到那个方法,对计算机而言,就是要定位到方法所在的内存地址。...因为目前我们关注的是方法调用,所以对class文件的具体结构我们就不做过多分析了,我们主要就看看常量池跟方法表。...调用了那个被桥接的方法,也就是我们真正定义的重写的方法 2: invokevirtual #3 // Method get:(Ljava/lang/Number...桥接方法到底桥接的什么?其实就是编译器对JVM到JAVA的一个桥接,编译器为了满足JAVA的重写的语义,生成了一个方法描述符与父类一致的方法,然后又调用了真实的我们定义的逻辑。

    1.6K20

    Objective-C中的一些特殊的数据类型

    这篇文章最底层的定义开始,介绍一下这些类型到底是怎么定义的,这会帮助我们更加深入地了解Objective-C。...下面是objc.h中摘录的一段,定义了一些数据类型: // objc.h typedef struct objc_class *Class; typedef struct objc_object {...那么实际上,你使用GNU Objective-C的运行时间库和NeXT Objective-C的运行运行时间库(Mac OS X使用NeXT的运行时间库)时,它们的定义是不一样的。...说白了SEL就是返回方法名。 IMP 从上面的头文件中我们可以看到,IMP定义为 id (*IMP) (id, SEL, …)。...这样说来, IMP是一个指向函数的指针,这个被指向的函数包括id(“self”指针),调用的SEL(方法名),再加上一些其他参数。 说白了IMP就是实现方法

    64520

    动态的Objective-C——关于消息机制与运行时的探讨

    动态的Objective-C——关于消息机制与运行时的探讨 一、引言     Objective-C是一种很优美的语言,至少在我使用其进行编程的过程中,是很享受他那近乎自然语言的函数命名、灵活多样的方法调用方式以及配合...Objective-C是扩展与C面向对象的编程语言,然而其方法调用方式又和大多面向对象语言大有不同,其采用的是消息传递、转发的方式进行方法调用。...二、消息发送与转发机制 1.初窥消息发送机制     许多面向对象语言中方法调用都是采用obj.function这样的方式,在Objective-C语言中却是采用中括号包裹的方式进行方法调用,例如[obj...,同样如果调用方法,实际上是类的元类中找到对应的方法列表,这个列表就是我们前面提到的方法签名列表,进行方法的执行。...2.super关键字到底做了什么     做了这么久的Objective-C开发,你是否真的理解super关键字的含义?你一定会说,这很简单啊,self调用本类的方法,super调用父类的方法

    82040

    Objective-C方法进行注释的方法

    名字看着挺绕的哈,其实就是对某个自己创建的方法进行注释,类似编写java代码时的注释javadoc一样,可以自动形成规范性的方法说明。...我们对方法进行注释时,最需要说明的就是方法的作用、方法的参数以及方法返回的结果,所以这里也只说这三个标签,其实很简单,如下所示: /** * @brief 通过两个参数请求一个结果....,紧挨着方法名在其上方输入上述的注释。...现在我们调用方法,然后在调用的地方对着方法名,按住option键,也就是alt键,再点击方法名,就会弹出方法的说明,这时就可以看到我们注释的效果了: 这样是不是很清晰明了。...虽然在声明方法时会做很多额外的工作,但是当代码量大了以后,这样做的效果就出来了,免得总是忘记各个方法是做什么的,参数又是什么,毕竟不能总是依靠起名嘛。

    45820

    iOS底层原理(二):运行时研究(一)

    理解Objective-C的运行时机制可以帮我们更好的了解这个语言,适当的时候还能对语言进行扩展,系统层面解决项目中的一些设计或技术问题。...当你编译包含OC类和方法的代码时,编译器创建用来实现语言动态特性的数据结构体和方法调用。...通过调用NSObject的方法间接调用运行时 这里给大家解释一下:以上方法都是在运行时会编译成响应的方法:- (BOOL)respondsToSelector:(SEL)aSelector比如我们看编译会来到...runtime非常重要的方法,下面我们花点篇幅介绍一下 lookUpImpOrForward这个方法里面篇幅很长里面介绍了以下几点: 如果缓存是YES,则从缓存中查找IMP。...,为什么还要取一次内存,要知道OC是动态语言,在我们执行这个获取imp的时候,外界在开锁,解锁的时候是可以访问的,动态操作) 如果没有从缓存中查找到,则从方法列表中获取方法 如果还没有,就从父类缓存或者方法列表获取小鬼

    33040

    iOS 开发:『Runtime』详解(一)基础知识

    C 语言 作为一门静态类语言,在编译阶段就已经确定了所有变量的数据类型,同时也确定好了要调用的函数,以及函数的实现。 而 Objective-C 语言 是一门动态语言。...Objective-C 语言 把一些决定性的工作编译阶段、链接阶段推迟到 运行时阶段 的机制,使得 Objective-C 变得更加灵活。...消息机制的基本原理 Objective-C 语言 中,对象方法调用都是类似 [receiver selector]; 的形式,其本质就是让对象在运行时发送消息的过程。...Runtime 中的概念解析 3.1 objc_msgSend 所有 Objective-C 方法调用在编译时都会转化为对 C 函数 objc_msgSend 的调用。...当一个方法找不到的时候,Runtime 提供了 消息动态解析、消息接受者重定向、消息重定向 等三步处理消息,具体流程如下图所示: 4.1 消息动态解析 Objective-C 运行时会调用 +resolveInstanceMethod

    1.3K40

    RunTime 之使用前须知

    SEL 方法名称的描述。 IMP 具体的方法的地址。 消息机制 动态特性 在Objective-C中,任何类的定义都是对象。类和类的实例(对象)没有任何本质上的区别。...至此,我们就很清楚地知道 IMP 的含义:IMP 是一个函数指针,这个被指向的函数包含一个接收消息的对象id(self 指针), 调用方法的选标 SEL (方法名),以及不定个数的方法参数,并返回一个...也就是说 IMP 是消息最终调用的执行代码,是方法真正的实现代码 。我们可以像在C语言里面一样使用这个函数指针。...调用一个实例的方法,所做的是向该实例的指针发送消息,实例在收到消息后,自身的实现中寻找响应这条消息的方法。 动态绑定所做的,即是在实例所属类确定后,将某些属性和相应的方法绑定到实例上。...---- 参考文章: 深入Objective-C的动态特性 关于CLASS , SEL, IMP的说明 唐巧-Objective-C对象模型及应用

    73320
    领券