以下代码是在解决http://www.junwen1992.com//articles/2016/01/11/1452496926024.html篇文章中谈到的js与Obj-C交互的实现中遇到的。
以下方法在执行时是会出现问题的。描述: target是我定义的一个类叫A类,A类中定义了一个方法-(void*)methodA:(id *)str方法。
-(id)addTarget:(id)target performFunctionWithName:(NSString*)functionName withObject:(id)object{
if(target &&[target respondsToSelector:NSSelectorFromString(functionName)]){
SEL selector =NSSelectorFromString(functionName);
IMP imp =[target methodForSelector:selector];
id (*func)(id, SEL, id)=(void*)imp;
func(target, selector);
returnnil;//这个方法有警告,用上面的方法代替,出去警告
// [target performSelector:NSSelectorFromString(functionName) withObject:object];
}
returnnil;
}
转载本博客时请附上本博客链接地址 http://www.junwen1992.com//articles/2016/04/25/1461565815354.html
解释:IMP imp =[target methodForSelector:selector];通过这个方法,我们可以得到A类中的methodA方法的函数指针。
id (*func)(id, SEL, id)=(void*)imp;这个方法由于我们这里定义的是id返回值类型的,但是实际中A类的方法methodA是无返回值的,所以到了这一步,肯定是会奔溃的。
于是解决办法就是在定义的时候判断是否有返回值。
如下:
if(target &&[target respondsToSelector:NSSelectorFromString(functionName)]){
SEL selector =NSSelectorFromString(functionName);Method method = class_getInstanceMethod([target class], selector);
constchar *returnType = method_copyReturnType(method);//获得了需要调用的那个方法的返回值类型
IMP imp =[target methodForSelector:selector];char*voidType ="v";//void的返回值类型对应为vif(strcmp(returnType, voidType)==0){//无返回值类型void(*func)(id, SEL, id)= imp;
func(target, selector,object);}else{//有返回值类型
id (*func)(id, SEL, id)= imp;return func(target, selector,object);}returnnil;
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于