码迷,mamicode.com
首页 > 其他好文 > 详细

SEL 、IMP

时间:2015-10-27 19:42:48      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:

      本来想自己写写关于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使用的一个简单的例子,有什么问题请多多指教。

SEL 、IMP

标签:

原文地址:http://www.cnblogs.com/aaron-kefan/p/4914753.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!