标签:
本来想自己写写关于SEL、IMP的心得,但是今天看了一篇特别不错的文章http://www.cnblogs.com/yaski/archive/2009/04/05/1429735.html,里面讲的很详细,而且有demo,我就不画蛇添足了。
但是里面有个地方得注意一下,就是DoProxy.m文件里- (void)functionPointers这个方法的实现方法,原代码如下:
- (void) functionPointers { setSkinColor_Func=(void (*)(id, SEL, NSString*)) [cattle[1] methodForSelector:skin]; //IMP setSkinColor_Func = [cattle[1] methodForSelector:skin]; say_Func = [cattle[1] methodForSelector:say]; setSkinColor_Func(cattle[1],skin,@"verbose"); NSLog(@"Running as a function pointer will be more efficiency!"); say_Func(cattle[1],say); }
但是这样你直接运行的话会报如下错误:
这是默认情况下,你工程的Enable Strict Checking of objc_msgSend Calls是打开的,只要把它关掉就OK了(把Yes改成No),如下图
但是这样改了之后会发现,它又会报一个发生经典的EXC_BAD_ACCESS错误,那是因为咱们定义的这个IMP是有返回值的,而- (void)functionPointers这个方法是没有返回值的。这时候我用了一个办法,就是重新定义一个返回值为void的函数指针,并把这个IMP强转,然后再运行就没问题了。具体代码如下:
- (void)functionPointers { setSkinColor_Func = (void (*) (id, SEL, NSString *))[cattle[1] methodForSelector:skin]; say_Func = [cattle[1] methodForSelector:say]; setSkinColor_Func(cattle[1], skin, @"verbose"); NSLog(@"Running as a function pointer will be more efficiency!"); //say_Func(cattle[1],say); void (*abc) (id, SEL) = (void (*) (id, SEL))say_Func; abc(cattle[1], say); }
这只是IMP使用的一个简单的例子,有什么问题请多多指教。
标签:
原文地址:http://www.cnblogs.com/aaron-kefan/p/4914753.html