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

XCode 12 IMP实例错误:函数调用的参数太多,应为0,实际为2

XCode是苹果公司开发的一款集成开发环境(IDE),用于开发苹果操作系统(iOS、macOS等)上的应用程序。XCode提供了丰富的工具和功能,包括代码编辑器、编译器、调试器、界面设计工具等,可以帮助开发人员快速开发高质量的应用程序。

IMP是Objective-C语言中的一个数据类型,代表一个指向方法的指针。IMP实例错误是指在使用IMP进行函数调用时出现了参数个数不匹配的错误。具体来说,上述错误表示实际传递给函数的参数个数为2,但函数声明中没有参数,导致出现了参数个数不匹配的错误。

解决这个错误的方法通常有两种途径:

  1. 检查函数声明和调用:确保函数声明中的参数个数与实际调用时传递的参数个数一致。如果函数声明中不需要参数,确保调用时不传递任何参数。
  2. 检查函数定义:如果函数定义中确实需要参数,但函数声明中没有声明参数,需要更新函数声明以匹配函数定义。

总结: XCode 12是苹果公司开发的一款集成开发环境,用于开发苹果操作系统上的应用程序。IMP是Objective-C语言中的一个数据类型,代表一个指向方法的指针。XCode 12 IMP实例错误是指在使用IMP进行函数调用时出现了参数个数不匹配的错误。解决这个错误的方法包括检查函数声明和调用以及检查函数定义,确保参数个数匹配。

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

相关·内容

iOS: ARM64不定函数传参问题调试剖析

快速复习 便于阅读后续代码,该部分主要帮助理解: 1.OC方法调用会被转化为普通C函数调用 2.IMP指针就是一个普通C函数指针,SEL类型用于标示类一个方法 3.可以直接拿到一个OC方法实现...这里不作赘述,不是重点 ;-) 上述流程中IMP指针是普通C函数指针,原型id (*IMP)(id, SEL, ...) ,指向方法实际函数体实现。...2.将函数指针强转为与原函数参数列表一致函数指针类型再调用: ARM64架构参数传递符合预期 每段测试代码都只展示了关键函数指针调用语句对应汇编,便于阅读,关键汇编语句含义已经注释在末尾。...测试代码2 暂时没有太多头绪,因此查看两个参数传递情况,编写测试代码Code 4-3。该代码测试执行crash情况与Code 4-2相同。 ?...可是,根据以往Google了解,ARM64调用约定是: 前8个参数依次通过X0-X7寄存器传递,剩下参数从右往左依次入栈,由被调用者实现栈平衡,返回值存放在X0 中。 实际情况也的确如此。

2.4K33
  • 无源调试

    OC解决这个冲突方案是做方法缓存。每一个类有一个cache,用于存储方法selectors和函数指针,也就是所谓IMP。他们被组成一个哈希表,所以查找时候是非常快。...因此,objc_msgSend主要有以下几个步骤: 获取传入对象类 获取这个类方法缓存 通过传入selector,在缓存中查找方法 如果缓存中没有,调用C代码 跳到这个方法IMP 3、objc_msgSend...他们被标记为x0~x30。同样也有可能使用w0到w30来访问寄存器低32位。寄存器x0x7被用于函数入参前8个参数。...x0到x7用来做参数传递,以及从子函数返回结果(通常通过x0返回,如果是一个比较大结构体则结果会存在x8执行地址上) LR:即x30寄存器,也叫链接寄存器,一般是保存返回上一层调用地址 FP:...,很有可能这部分内存就被覆盖,一个已经释放了OC对象继续调用实例方法时,在objc_msgSend函数内部读取到objisa指针得到将是一个未知或者有可能无效指针值,指向内存错误,出现野指针错误

    44820

    消息转发流程源码探究

    类方法动态方法决议 通过上面_class_resolveMethod函数源码我们知道,如果所查找方法是实例方法,那么就调用_class_resolveInstanceMethod;如果所查找方法是类方法...通过_class_resolveMethod函数源码我们发现,当查找是类方法时候,在调用函数之后,会再查找一遍对应类方法,如果没有找到的话就会接着执行_class_resolveInstanceMethod..._class_resolveInstanceMethod函数进入实例方法动态决议,测试参数cls是元类,因此最终会在根元类父类NSObject中去查找OC+resolveInstanceMethod...这个函数还有一个作用就是它会拦截所有找不到IMPSEL,要么处理它,要么让它失效,总之,不会让它走到崩溃那一步。...4是当前定位到位置,也就是[norman play];代码调用位置,1是发送崩溃信息位置,2【#2 0x000000010ac7e7bc in ___forwarding___ ()】就是消息转发位置了

    57030

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

    实际上,Objective-C中每一句方法调用最后都会转换成一条消息进行发送。一条消息包含3部分内容:方法选择器、接收消息对象以及参数。objc_msgSend函数就是用来发送这种消息。...我们再来看objc_msgSend()函数,前面说过,它第一个参数接收消息对象,第2参数方法签名,之后为传递参数。...,第一个参数Class对象,第二个参数方法选择器,第三个参数IMP类型函数指针,第四个参数指定方法返回值和参数类型。...这个参数采用是C字符串形式来指定返回值和参数类型,第1个字符返回值类型,其后都为参数类型,需要注意,使用这种方式添加方法时候系统会默认传入两个参数,分别是调用此方法实例对象和方法选择器,上面示例代码中...实现 BOOL imp_removeBlock(IMP anImp); 上面列举函数中很多都用到参数类型指定,types需要设置C风格字符数组,即C字符串,其中第1个字符表示返回值类型,其余字符依次表示参数类型

    81940

    如何定位Obj-C野指针随机Crash(三):加点黑科技让Crash自报家门

    imp; …... typedef uintptr_t cache_key_t; 根据苹果函数调用约定,objc_msgSend被调用时候,寄存器对应关系:r0是对象本身self,r1是sel...0x2f879f4e : and.w r12, r12, r1 //r1和shiftmask与,放到r12,r1是参数一,也就是sel,用来计算selindex 0x2f879f52...] //是的话就取出imp 0x2f879f64 : bx r12 //调sel实现,跳到imp里面去执行 其实上面的代码就是从缓存中找sel实现过程,而错误地址之所以是...如果出现dealloc使用错误,例如先[super dealloc],然后release成员变量,那么就会出现崩溃现象,且此时对象地址0x55555555。...另外一点,就是方便区分野指针,例如在Xcode启用Enable Scribble时,指定alloc之后填写地址0xaa,防止内存初始化就使用,也是为了方便和free之后内存做区分。

    94830

    如何定位Obj-C野指针随机Crash(三):如何让Crash自报家门

    imp; …... typedef uintptr_t cache_key_t; 根据苹果函数调用约定,objc_msgSend被调用时候,寄存器对应关系:r0是对象本身self,r1是sel...0x2f879f4e : and.w r12, r12, r1 //r1和shiftmask与,放到r12,r1是参数一,也就是sel,用来计算selindex 0x2f879f52...] //是的话就取出imp 0x2f879f64 : bx r12 //调sel实现,跳到imp里面去执行 其实上面的代码就是从缓存中找sel实现过程,而错误地址之所以是...如果出现dealloc使用错误,例如先[super dealloc],然后release成员变量,那么就会出现崩溃现象,且此时对象地址0x55555555。...另外一点,就是方便区分野指针,例如在Xcode启用Enable Scribble时,指定alloc之后填写地址0xaa,防止内存初始化就使用,也是为了方便和free之后内存做区分。

    6.1K52

    runtime那些事(二)——NSObject数据结构

    结构体 class_data_bits_t 指向了 class_ro_t 指针; 类属性、方法、遵循协议数组都是在编译期就已经确定(不包括分类信息),只读属性,存储于 class_ro_t; 类定义实例化方法会添加至...通过散列表形式缓存调用方法函数,大幅提高访问速度。 ?...bucket_t声明 cache_key_t _key代表@selector方法名称 IMP _imp代表函数存储地址  在public中,可以发现对key与对应IMP存储过程,此处通过...当_key值0或者_key内容(即selector方法名称)与传参newKey相同时,不再进行下一步操作、  2. newImp直接赋值给_imp  3....此处若不添加mega_barrier()函数,则可能会造成先执行了_key赋值,再执行_imp赋值问题。 cache 查找过程:(以对象方法例)  (1).

    91220

    iOS runtime探究(四): 从runtiem开始实践Category添加属性与黑魔法method swizzling你要知道runtime都在这里

    具体需要使用C函数如下: //一个实例对象添加一个关联对象,由于是C函数只能使用C字符串,这个key就是关联对象名称,value具体关联对象值,policy关联对象策略,与我们自定义属性时设置修饰符类似...通过方法method_getImplementation就可以获取到实例方法具体实现imp,这个具体实现就是我们自定义实例方法一个C函数,因此,如果该方法内不访问任何其他实例变量并且没有任何参数就可以直接执行该函数...函数动态一个类添加实例方法,具体栗子可以查看前文从runtime开始: 深入理解OC消息转发机制这里不再赘述。...selector选择子,同时也有一个函数指针_imp,这个函数指针就指向实例方法具体实现。...需要注意是,交换两个方法实现是在运行时进行,当你调用myViewWillAppear:方法时,实际会执行viewWillAppear:方法实现,因此不会导致递归调用

    82260

    iOS-底层原理36:内存优化(一) 野指针探测

    访问未分配内存、写入没有写权限内存等。 SIGBUS 总线错误。比如内存地址对齐、错误内存类型访问等。 SIGILL 执行了非法指令,一般是可执行文件出现了错误 SIGFPE 致命算术运算。...Bugly工程师:陈其锋分享,在其代码中主要思路是 1、通过fishhook替换C函数free方法自定义safe_free,类似于Method Swizzling 2、在safe_free方法中对已经释放变量内存...Zombie Objects 僵尸对象 可以用来检测内存错误(EXC_BAD_ACCESS),它可以捕获任何阐释访问坏内存调用 给僵尸对象发送消息的话,它仍然是可以响应,然后会发生崩溃,并输出错误日志来显示野指针对象调用类名和方法...方法自定义dealloc方法 2、为了避免内存空间释放后被重写造成野指针问题,通过字典存储被释放对象,同时设置在30s后调用dealloc方法将字典中存储对象释放,避免内存增大 3、为了获取更多崩溃信息...,该值会被解释一个给定NSObject类型 - 参数1:NSValue对象值 - 参数2:给定值对应OC类型,需要使用编译器指令

    2.2K31

    Objc Runtime 总结

    extraBytes通常0 // 销毁一个类及其相关联类 void objc_disposeClassPair ( Class cls ); //在运行中还存在或存在子类实例,就不能够调用这个。...,class_addIvar函数新类添加方法,实例变量和属性后再调用这个来注册类,再之后就能够用了。...method_imp OBJC2_UNAVAILABLE; // 方法实现,函数指针 } Method相关操作函数 Method // 调用指定方法实现,返回是方法实现时返回,参数receiver...如果是传递给超类就会调用带super函数,如果返回是数据结构而不是一个值就会调用带stret函数。在i386平台返回类型浮点消息会调用objc_msgSend_fpret函数。...// 创建一个指针函数指针,该函数调用时会调用特定block IMP imp_implementationWithBlock ( id block ); // 返回与IMP(使用imp_implementationWithBlock

    75620

    KVO详解及底层实现

    那么这个框架内部又是怎么实现呢,我们可以下断点,查看下函数调用栈: 首先通过设置一个观察点,观察属性变化: 继续执行,可以看到函数调用栈如下: 在结果发生改变地方继续下断点调试: 由以上函数调用栈...: class:重写这个方法,是为了伪装苹果自动我们生成中间类。...创建类 Class customClass = objc_allocateClassPair([NSObject class], "ZJCustomClass", 0); 添加实例变量 // 添加实例变量...class_addIvar(customClass, "age", sizeof(int), 0, "i"); 添加方法,V@:表示方法参数和返回值 // 添加方法 class_addMethod...中一个配置,将它改为NO,否则会报参数太多错误: 注意二 解释下代码中v@:@意思: 第一个v表示方法返回值void 第二三个@:一般是一块,因为函数至少有两个参数self和_cmd,一般是固定写法

    2.3K20

    iOS底层原理之Runimte 运行时&方法本质

    运行时检查错误和编译时检查错误不一样,不是简单代码扫描,而是在内存中做操作和判断。...第一种汇编,第二种C++代码,汇编方式方法参数需要读寄存器不方便。 所以采用第二种方式生成main.cpp文件,首先自定义LWPerson类,在类中添加实例方法,在main函数调用。...-- Enable strict checking of obc_msgSend calls设置NO 调用父类方法 调用本类中方法实际是通过objc_msgSend发送,那么调用分类方法消息发送是什么样呢...$0, $0, $3 // $0 = imp ^ class 这一步是对imp就行解码,获取运行时imp地址 br $0 //调用 imp .endmacro ......即imp = imp ^ class,然后调用解码后imp 遍历缓存流程图 疑问:为什么要判断bucket中sel = 0,等于0直接查找缓存流程就结束了。

    37710

    iOS 底层拾遗:objc_msgSend 与方法缓存

    and p16, $0, #ISA_MASK // #define ISA_MASK 0x0000000ffffffff8ULL ... $0获取宏第一个参数调用时传p13,即是isa。...),那么此时寄存器布局就是:x0 -> receiver / x1 -> selector / x2 -> class,也就对应了这个方法参数列表: IMP _class_lookupMethodAndLoadCache3..._class_resolveMethod会向对象发送+resolveInstanceMethod(实例对象)或+resolveClassMethod(类对象)方法,开发者可以在这两个方法中类动态加入IMP...对于cache_t来说,读取_buckets和_mask都是没有加锁,那么就一定要保证_buckets实际长度始终大于_mask,最坏情况不过只是访问不到已有的缓存,不然在进行 hash 运算后很可能访问到错误或非法内存...还记得前面的cache->isConstantEmptyCache()调用判断缓存是否只读么?这个函数实际上就是调用了emptyBucketsForCapacity判断这个缓存数组是否属于只读数组。

    1.1K10

    机器学习(六)— logistic回归

    logistic回归因变量可以是二分类,也可以是多分类,但是二分类更为常用,也更加容易解释,所以实际中最为常用就是二分类logistic回归。   ...为了实现logistic回归分类器,我们可以在每个特征上乘以一个回归系数,将所有的乘积相加,将和值代入sigmoid函数中,得到一个范围0-1之间数,如果该数值大于0.5则被归入1类,否则被归0类...基于之前分析,需要找到回归系数,首先我们可以将sigmoid函数输入形式记为:z = w0x0 + w1x1 +......xcode1 = [] ycode1 = [] xcode2 = [] ycode2 = [] for i in range(n): if int(labelMat[i])...Logistic回归目的是寻找到一个非线性sigmoid函数最佳拟合参数,可以采用梯度上升法优化,而在这个过程中,为了减少时间复杂度,又可以使用随机梯度上升法来简化梯度上升法。

    40020
    领券