使用IMP报错:参数错误

本文探讨了Objective-C运行时中的class_replaceMethod函数使用过程及遇到的问题。通过修改项目的构建设置,解决了因EnableStrictCheckingofobjc_msgSendCalls选项导致的错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在学习OC 运行时(runtime),测试了一个函数class_replaceMethod,具体如下:

IMP originalMethod;
NSString *CustomUppercaseString(id SELF,SEL _CMD){
    NSLog(@"BeginConverting。。。");
    NSString *result=originalMethod(SELF,_CMD);
    NSLog(@"EndConverting。。。");
    return result;
}
//Implementation中:
- (void)runtimeTest{
    originalMethod=[NSString instanceMethodForSelector:@selector(uppercaseString)];
    class_replaceMethod([NSString class], @selector(uppercaseString), (IMP)MyUppercaseString,NULL);
    NSString *s=@"zhang lei";
    NSLog(@"uppercase:%@",[s uppercaseString]);
}

运行过程中在下面这行报错:

NSString *result=originalMethod(SELF,_CMD);

①先是提示参数太多,问百度说是IMP本身包含了self和_cmd俩参数,不用再显示传参。去掉参数后继续报错。
②提示在ARC下无法将void *转换为id。关闭ARC后依旧出错,还是无法转换。
当我查看IMP的定义时发现了这个:

/// A pointer to the function of a method implementation. 
#if !OBJC_OLD_DISPATCH_PROTOTYPES
typedef void (*IMP)(void /* id, SEL, ... */ ); 
#else
typedef id (*IMP)(id, SEL, ...); 
#endif

报错的主要原因是因为IMP取的是if中的定义,返回void *,于是怀疑项目编译设置上设置的不对。继续搜百度找到如下内容:
“使用XCode的小伙伴们要特别注意了,需要先到项目的构建设置里面把Apple LLVM X.0 - Preprocessing 的Enable Strict Checking of objc_msgSend Calls 选项设置为NO,否则result = imp(clazz, sel);会报错的!!”
按照上面说的进行了设置,运行成功。并且经过调试,发现确实是Enable Strict Checking of objc_msgSend Calls控制着OBJC_OLD_DISPATCH_PROTOTYPES的取值。

本文出自 “Layne的学习园地” 博客,请务必保留此出处http://laynestone.blog.51cto.com/9459455/1700913

matlab 数字信号处理函数 matlab实现数字信号处理的一些经典理论 内涵: 滤波器的设计,模拟与数字 采样定律 Z变换与s域映射 卷积原因 截断效应 各种变换 如:DFS DFT IDFT 具体的如下: % 离散信号和系统 % conv_m - 改进的线性卷积子程序 (第22页) % conv_tp - 用Toeplitz矩阵计算的线性卷积(第34页) % evenodd - 将实信号分解为偶和奇两部分(第15页) % impseq - 产生脉冲序列 (第6页) % sigadd - 信号相加运算(第8页) % sigfold - 信号折叠运算(第10页) % sigmult - 信号乘法运算(第9页) % sigshift - 信号时移运算(第9页) % stepseq - 产生阶跃序列(第6页) % 离散时间付利叶变换(第 z变换) % pfe2rfz - 在z域由部分分式展开为有理函数(第四章) % rf2pfez - 在z域由有理函数展开为部分分式(第四章) % 离散付利叶变换 % circevod - 实信号分解为循环偶分量和循环奇分量(第132页) % circonvt - 时域中的循环卷积(第139页) % cirshftt - 时域中的循环移位(第146页) % dfs - 计算离散付利叶系数(第109页) % dft - 计算离散付利叶变换(第120页) % hsolpsav - 采用FFT 高速分段卷积的重叠保留法(第157页) % idfs - 计算逆离散付利叶级数(第110页) % idft - 计算逆离散付利叶变换(第121页) % mod - 计算 m = n mod N (第119页) % ovrlpsav - 分段卷积的重叠保留法 (第147页) % 数字滤波器结构 % cas2dir - 级联到直接的形式转换(第173页) % casfiltr - IIR 和 FIR 滤波器的级联实现(第172页) % cplxcomp - 比较两个复数对(第176页) % dir2cas - 直接到级联的型式转换(第171页) % dir2fs - 直接形式到频率采样型的转换(第187页) % dir2ladr - IIR 直接形式极__零点到格型/梯形的转换(第199页) % dir2latc - FIR 直接形式到全零点格型形式的转换(第193页) % dir2par - 直接到并联形式的转换(第175页) % dir2paro - 直接到并联形式的转换(用于旧版信号处理工具箱) % ladr2dir - 格型/梯形形式到IIR 直接形式的转换(第199页) % ladrfilt - 格型/梯形形式的IIR 滤波器实现(第200页) % latc2dir - 全零点格型形式到FIR 直接形式的转换(第194页) % latcfilt - FIR 滤波器的格型形式的实现(第194页) % par2dir - 并联形式到直接形式的转换(第177页) % parfiltr - IIR 滤波器的并联形式的实现(第177页) % FIR 滤波器设计 % ampl_res -由FIR滤波器脉冲响应求其幅频特性(第271页 ) % blackman - 布莱克曼窗函数(第230页) % freqz_m - 改进型的freqz 子程序(第233页) % Hr_Type1 - 计算1型FIR低通滤波器(第215页) % Hr_Type2 - 计算2型FIR低通滤波器(第216页) % Hr_Type3 - 计算3型FIR低通滤波器(第216页) % Hr_Type4 - 计算4型FIR低通滤波器(第216页) % ideal_lp - 理想低通滤波器脉冲响应计算 (第232页) % IIR 滤波器设计 % afd_butt - 模拟低通巴特沃思滤波器设计(第286页) % afd_chb1 - 模拟低通切比雪夫Ⅰ型滤波器设计(第292页) % afd_chb2 - 模拟低通切比雪夫Ⅱ型滤波器设计(第295页) % afd_elip - 模拟椭圆低通滤波器设计(第299页) % cheb1hpf - 用切比雪夫Ⅰ型原型作 IIR 高通滤波器设计(第330页) % freqs_m - 改进型的freqs 子程序(第286页) % imp_invr - 由模拟到数字滤波器的脉冲响应不变变换(第303页) % sdir2cas - s平面的直接形式到级联形式的变换(第282页) % u_buttap - 未归一化的巴特沃思模拟低通滤波器原型(第282页) % u_chb1ap - 未归一化的切比雪夫Ⅰ型模拟低通滤波器原型(第290页) % u_chb2ap - 未归一化的切比雪夫Ⅱ型模拟低通滤波器原型(第294页) % u_elipap - 未归一化的椭圆模拟低通滤波器原型(第298页) % zmapping - z域中的频带变换(第326页) % 自适应滤波 % lms - 系数调整的LMS 算法(第347页) % 数字通信 % mulaw_c -μ规则压缩器(式(10.5)) % mulaw_e - μ规则扩张器(式(10.7)) % quantize - 将信号量化为b 位(图 10.2) % 杂项 % contents - 内容文件(你正在读的) % db2delta - 由相对的 dB 数转换为绝对的 delta 数.(第七章) % delta2db - 由绝对的 delta 数转换为相对的 dB 数(第七章) % pzplotz - 按正方坐标画出z平面上的单位圆及零极点分布图(第三章) % sinc - sinc(x)=sin(pi*x)/(pi*x)(第三章)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值