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

从Objective-C块创建IMP

根据您提供的问答内容,我理解您要求我作为云计算领域的专家,给出关于从Objective-C块创建IMP的详细答案。以下是我的答案:

Objective-C 块创建 IMP

从 Objective-C 块创建 IMP(即实例方法)需要使用 objc_msgSend 函数。objc_msgSend 函数接收两个参数:接收器(receiver)和消息(message)。

以下是 Objective-C 块创建 IMP 的示例代码:

代码语言:objective-c
复制
// 定义一个 C 函数,接收一个 Objective-C 对象和消息,然后调用相应的 IMP
void invoke_imp(id receiver, SEL _cmd, ...) {
    va_list args;
    va_start(args, _cmd);

    id arg = va_arg(args, id);
    while (arg != nil) {
        [receiver performSelector:NSSelectIndexWithObjCType:arg];
        arg = va_arg(args, id);
    }

    va_end(args);
}

// 创建 IMP 示例
IMP my_imp = ^(NSArray *args) {
    NSLog(@"Received message: %@", args);
};

// 创建一个对象,并将 IMP 绑定到对象
id my_object = [[NSObject alloc] init];
objc_setAssociatedObject(my_object, @"my_imp", my_imp, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

// 调用对象的方法,实际上会调用 IMP
[my_object myMethodWithArgs:@"hello" arg2:42];

IMP 示例代码

代码语言:objective-c
复制
// 定义一个 C 函数,接收一个 Objective-C 对象和消息,然后调用相应的 IMP
void invoke_imp(id receiver, SEL _cmd, ...) {
    va_list args;
    va_start(args, _cmd);

    id arg = va_arg(args, id);
    while (arg != nil) {
        [receiver performSelector:NSSelectIndexWithObjCType:arg];
        arg = va_arg(args, id);
    }

    va_end(args);
}

// 创建 IMP 示例
IMP my_imp = ^(NSArray *args) {
    NSLog(@"Received message: %@", args);
};

// 创建一个对象,并将 IMP 绑定到对象
id my_object = [[NSObject alloc] init];
objc_setAssociatedObject(my_object, @"my_imp", my_imp, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

// 调用对象的方法,实际上会调用 IMP
[my_object myMethodWithArgs:@"hello" arg2:42];

在上述示例代码中,我们定义了一个名为 invoke_imp 的 C 函数,该函数接收一个 Objective-C 对象和消息,然后调用相应的 IMP。我们还创建了一个 IMP 示例,并将其绑定到一个对象。最后,我们调用对象的方法,实际上会调用 IMP。

需要注意的是,使用 objc_msgSend 函数调用方法时,方法必须是有符号的,因为 objc_msgSend 函数是使用 C 语言实现的,不支持无符号方法调用。

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

相关·内容

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

今天在园子里看到了一篇牛文“Objective-C 2.0 with Cocoa Foundation--- 5,Class类型,选择器Selector以及函数指针 ”,讲得十分精彩,忍不住把它的代码加上注释整理于此...而选择器SEL与函数指针IMP,如果非要跟c#扯上关系的话,这二个结合起来,就点类似c#中的反射+委托,可以根据一个方法名称字符串,直接调用方法。...SEL say; SEL skin; //定义一个函数指针(传统C语言的处理方式) void(*setSkinColor_Func)(id,SEL,NSString*); //定义一个IMP...方式的函数指针(obj-C中推荐的方式) IMP say_Func; //定义一个类 Class bullClass; } -(void) doWithCattleId:(id) aCattle...setSkinColor_Func=(void (*)(id, SEL, NSString*)) [cattle[1] methodForSelector:skin]; //上面的语句其实等效于下面这种方法 //IMP

1.8K51

iOS开发 —— Runtime

Runtime 因为Objc是一门动态语言,所以它总是想办法把一些决定工作编译连接推迟到运行时。...这就是 Objective-C Runtime 系统存在的意义,它是整个Objc运行框架的一基石。 Runtime基本是用C和汇编写的,可见苹果为了动态系统的高效而作出的努力。...比如我们创建一个类 名字叫 Family 创建一个数组来存储我们生成的 Family 对象。...消息传递的过程 在 Objective-C 中,类、对象和方法都是一个 C 的结构体, objc/objc.h 头文件中,我们可以找到他们的定义。...因为这一步不会创建任何新的对象,但下一步转发会创建一个 NSInvocation 对象,所以相对更快点。 Normal forwarding 这一步是 Runtime最后一次给你机会挽救程序。

1.2K30

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

都说 Objective-C 是一门动态语言。首先,动态与静态语言最大的区别,就是动态语言将数据类型的检查等决策尽可能地程序编译时推迟到了运行时。只要有可能,runtime 就会动态地完成任务。...当以上两步没问题后,将开始查找该类的 IMP,默认先从 cache 中寻找,若命中则执行对应的方法 4. 若 cache 中无法命中,则会尝试方法列表 methodLists 中寻找 5....关于types参数,即 IMP 函数实现的返回值与参数类型,可以参考官方说明文档Objective-C Runtime Programming Guide 在动态解析方法过程中 对象方法 执行的顺序为...的过程;若没有找到,就会进入动态解析流程; 第二次,下面红色边框中的信息,发现了消息转发相关方法的执行动作,也就是说第二次时消息转发过来的,意味着第一次动态解析失败了。...上述代码中,尝试将此类中的消息转发给了由 testTwo 类创建的对象实例——twoObj 并去执行。

1.2K20

KVC原理与数据筛选

设计稿出发,提升页面搭建效率,亟需解决的核心问题有: key-value-coding:键值编码,一种可以通过键名间接访问和赋值对象属性的机制; KVC是通过NSObject、NSArray、NSDictionary...技术类:明确是否为需求/技术层面引起的风险; 3.2.2 如上步骤没定位到访问器方法或成员变量则走下面的流程生成对应的getter 【Objective-c】 访问器方法生成IMP - (id)initWithContainerClassID...类型: 图4 get方法IMP类型 定义如下: 【Objective-c】 NSNumber * _DSGetIntValueWithMethod(id object, SEL selctor, Method...设计稿出发,提升页面搭建效率,亟需解决的核心问题有: 经过上面的分析可以明白KVC的真正执行流程。下面结合日常工程中的实际应用来优雅的处理数据筛选问题。...设计稿出发,提升页面搭建效率,亟需解决的核心问题有: KVC在处理简单数据类型时会经过数据封装和拆装并转换为对应的数据类型。

83120

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

它是Objective-C面向对象和动态机制的基石。 Objective-C是一个动态语言,这意味着它不仅需要一个编译器,也需要一个运行时系统来动态得创建类和对象,进行消息传递和转发。...理解Objective-C的运行时机制可以帮我们更好的了解这个语言,适当的时候还能对语言进行扩展,系统层面解决项目中的一些设计或技术问题。...高级编程语言想要成为可执行文件需要先编译为汇编语言再汇编为机器语言,机器语言也是计算机能够识别的唯一语言,但是OC并不能直接编译为汇编语言,要先而是转写为纯C语言再进行编译状语从句:汇编的操作,OC到...当你编译包含OC类和方法的代码时,编译器创建用来实现语言动态特性的数据结构体和方法调用。...这里也就是说我们如果之前响应过的,在高速缓存存过,就不需要下面的操作了 判断类是否已经被创建,如果没有被创建,则将类实例化 第一次调用当前类的话,执行初始化的代码 尝试获取这个类的缓存(这里很多小伙伴就会质疑

29540

聊几道面试题

SEL 和IMP sel是方法编号,它在read_images期间就编译进入了内存 IMP是函数指针,它指向了具体的函数实现 我们可以将sel理解成是一本书的目录title,将IMP理解成是一本书的页面...能否向运行时创建的类中添加实例变量? 不能向编译后得到的类中增加实例变量。 在运行时创建的类,只要还没有注册到内存,就还可以往其中添加实例变量。...具体可以参考类的加载(二)中的【如何动态创建一个类】篇章。...norman是一个指针,它指向了一内存区域,该内存区域里面存储了Norman的实例对象,这块内存区域里面存储的第一内容就是isa指针,因此该内存区域的地址就是isa指针的地址,因此我们可以说,norman...我们知道,一个实例对象的内存结构中,第一个就是isa指针,isa指针占8个字节;第二个开始,各个实例变量依次排列开来。

29421

Objective-C Runtime详解

这就是 Objective-C Runtime 系统存在的意义,它是整个Objc运行框架的一基石。 Runtime其实有两个版本:“modern”和 “legacy”。...与Runtime交互 Objc 三种不同的层级上与 Runtime 系统进行交互,分别是通过 Objective-C 源代码,通过 Foundation 框架的NSObject类定义的方法,通过对 runtime...2.0的遗留逻辑,但我们仍能从中获得一些有价值的信息,有兴趣的可以查看源代码 Objective-C 2.0 的头文件虽然没暴露出objc_class结构体更详细的设计,我们依然可以Objective-C...而最新版的 Runtime 源码对这一的描述已经有很大变化,可以参考下美团技术团队的深入理解Objective-C:Category....在一些计算机语言的原理中,一个类和元类层次结构可以更自由的组成,更深元类链和单一的元类继承的更多的实例化的类。Objective-C 的类方法 是使用元类的根本原因,在其他方面试图在隐藏元类。

1.7K60

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

例如,创建一个Xcode命令行工程,我们创建一个类,命名为MyObject,如下: MyObject.h文件: #import @interface...,同样如果调用加方法,实际上是类的元类中找到对应的方法列表,这个列表就是我们前面提到的方法签名列表,进行方法的执行。...接收者类型 __unsafe_unretained Class super_class; }; 在构造objc_super这个结构体时,receive为接收消息的对象,super_class为哪个类中查方法.../* cls:类 SEL:要替换实现的选择器 IMP:实现 types:参数类型字符串 */ IMP class_replaceMethod(Class cls, SEL name, IMP imp,...的实现 IMP imp_implementationWithBlock(id block); //获取IMP的实现block id imp_getBlock(IMP anImp); //删除IMP的block

76540

Xcode创建可复用的代码

Xcode创建可复用的代码         在各种程序开发中,编写代码的效率是非常重要的一个问题,各种优秀的编译器也都有相应的插件用于提高程序员的编码速度。...在xcode中,可以通过定义代码的方式将常用的一部分代码进行快捷呼出,首先xcode中为我们定义好了许多代码,例如: ?...在使用这些代码模板时,我们只需要将其拖入我们的代码中,或者直接键入快捷键即可,十分的方便,当然,我们也可以将我们自己常用的代码包装成模板,便于我们复用。...例如,我写如下的代码段: @property(nonatomic,copy)NSString * str; 将其选中,长按左键,直到鼠标变成箭头模样,然后将其拖入右下方的代码模板区,会弹出如下设置菜单...title用来设置我们的代码名称。 platform用来设置代码可以使用的平台。 Language用来设置支持的编程语言。

75720

iOS开发·runtime原理与实践: 基本知识篇(类,超类,元类,super_class,isa,对象,方法,SEL,IMP)

库函数的直接调用 1.2 各种基本概念的C表达 在 Objective-C 中,类、对象和方法都是一个 C 的结构体, objc/objc.h(对象,objc_object,id)以及objc/runtime.h...元类中存储着类对象的类方法,当访问某个类的类方法时会通过该isa指针元类中寻找方法对应的函数指针。...2.2 寻找 IMP 的过程: 在当前 class 的方法缓存里寻找(cache methodLists) 找到了跳到对应的方法实现,没找到继续往下执行 当前 class 的 方法列表里查找(methodLists...),找到了添加到缓存列表里,然后跳转到对应的方法实现;没找到继续往下执行 superClass 的缓存列表和方法列表里查找,直到找到基类为止 以上步骤还找不到 IMP,则进入消息动态处理和消息转发流程...还有一些 NSObject 的方法可以 Runtime 系统中获取信息,允许对象进行自我检查。

1.3K40

Objective-C RunTime概览

Objective-C可以『编译时』、『链接时』再到『运行时』,hold住尽可能多的决策。只要有可能,它都是动态地干活儿的。...(*IMP)(id _Nonnull, SEL _Nonnull, ...); #endif Method , SEL和IMP有什么区别?...Runtime应用 1.获取类的相关情况 比如,我想创建一个类似UITableView的类,然后打算参考一下官方的这个类都声明了哪些方法,可以用以下方式查看(头文件声明的方法并不是全部方法):...而利用Runtime,可以动态地添加方法的实现,防止crash: #import "Bird.h" #import // 创建Animal的子类Bird @implementation...而如果现在创建控制器对象,实际流程是这样的: viewWillAppea:被执行(实际上执行上述Category的antony_viewWillAppear:方法) antony_viewWillAppear

62530

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的运行时间库)时,它们的定义是不一样的。...IMP 从上面的头文件中我们可以看到,IMP定义为 id (*IMP) (id, SEL, …)。...这样说来, IMP是一个指向函数的指针,这个被指向的函数包括id(“self”指针),调用的SEL(方法名),再加上一些其他参数。 说白了IMP就是实现方法。

62220

Objective-C Runtime 详解

这就是 Objective-C Runtime 系统存在的意义,它是整个Objc运行框架的一基石。 Runtime其实有两个版本:“modern”和 “legacy”。...与Runtime交互 Objc 三种不同的层级上与 Runtime 系统进行交互,分别是通过 Objective-C 源代码,通过 Foundation 框架的NSObject类定义的方法,通过对 runtime...2.0的遗留逻辑,但我们仍能从中获得一些有价值的信息,有兴趣的可以查看源代码 Objective-C 2.0 的头文件虽然没暴露出objc_class结构体更详细的设计,我们依然可以Objective-C...而最新版的 Runtime 源码对这一的描述已经有很大变化,可以参考下美团技术团队的深入理解Objective-C:Category....dispatch_once 是GCD中的一次性方法,它保证了代码只执行一次,并让其为一个原子操作,线程安全是很重要的。

1.1K20

神奇的Runtime

找到了则分发,否则 3、用objc-class.mm中_class_lookupMethodAndLoadCache3检查本class的method list寻找selector,如果找到,填充到缓存中...- (id)forwardingTargetForSelector:(SEL)sel { return _otherObject; } 因为这一步不会创建任何新的对象,但下一步转发会创建一个 NSInvocation...IMP数据类型:他其实就是一个编译器内部实现时候的函数指针。当Objective-C编译器去处理实现一个方法的时候,就会指向一个IMP对象,这个对象是C语言表述的类型。...七、Method Swizzling原理 在Objective-C中调用一个方法,其实是向一个对象发送消息,查找消息的唯一依据是selector的名字。...利用Objective-C的动态特性,可以实现在运行时偷换selector对应的方法实现,达到给方法(Hook)挂钩的目的。

57220

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

Objective-C 语言 是一门动态语言。在编译阶段并不知道变量的具体数据类型,也不知道所真正调用的哪个函数。...Objective-C 语言 把一些决定性的工作编译阶段、链接阶段推迟到 运行时阶段 的机制,使得 Objective-C 变得更加灵活。...而实现 Objective-C 语言 运行时机制 的一切基础就是 Runtime。 Runtime 实际上是一个库,这个库使我们可以在程序运行时动态的创建对象、检查对象,修改类和对象的方法。...如果 -methodSignatureForSelector: 返回了一个 NSMethodSignature 对象(函数签名),Runtime 系统就会创建一个 NSInvocation 对象,并通过...- (void)forwardInvocation:(NSInvocation *)anInvocation { SEL sel = anInvocation.selector; //

1.2K40

iOS RunTime之二:数据结构

Class 源文件看出,Objective-C的对象就是一个包含isa指针的数据结构,而isa指针的数据类型是Class,Class表示对象所属的类。 ?...Paste_Image.png 源文件看出,Class其实就是一个objc_class结构体指针。...在Objective-C中,只要方法名相同,那么方法的SEL就是一样的,每一个方法都对应着一个SEL,所以在Objective-C中,同一个类中或者这个类的继承体系中,不能存在2个同名的方法,不同的类可以拥有相同的...IMP IMP就是implementation的缩写,本质就是一个函数指针,这个被指向的函数包含一个接收消息的对象id,调用方法的SEL,以及一些方法参数,并返回一个id。...Paste_Image.png SEL就是为了查找方法的最终实现IMP的,由于每个方法对应唯一的SEL,因此我们可以通过SEL方便快速准确地获得它所对应的IMP

54720

iOS_selector、SEL、IMP、Method都是什么,以及之间的关系

文章目录 一、SEL(selector) 二、IMP(implementation) 三、Method 总结 ​ 在 Objective-C中使用发送消息的形式来调用方法,其中涉及到 Runtime库中定义的...必须sel_registerName或@selector()(OC编译器指令)返回的值,获得选择器(用NSSelectorFromString也可以)。不能简单地将C字符串转换为SEL。...po selC "setTitle:" ​ 还可以使用sel_getName将SEL转回成Char*: NSLog(@"%s", sel_getName(selB)); // setTitle: ​ sel_getName...// 根据代码获取IMP, 其实就是代码IMP关联 IMP imp_implementationWithBlock(id block) // 根据Method获取IMP IMP method_getImplementation...OBJC2_UNAVAILABLE; ​ 代码的定义可以看出,Method是一个指向objc_method结构体类型的指针。

68120
领券