zoukankan      html  css  js  c++  java
  • IMP功能报错的解决

          今天优化一个缓存函数,缓存读写在项目中出现的非常频繁,正好之前看到autorelease采用了IMP caching机制,即在项目初始化时就绑定了selector、class和IMP,使得函数运行速率提升,于是想把IMP caching机制也运用到缓存函数上。

           原来的函数调用是这样的:

    NSData *data = [WBRequestCache  cacheForURL:url];

          函数通过URL获取缓存中存储的数据。

      现在的做法是先在项目初始化时就绑定相关的selector、class和IMP:

        id cache_class = [WBRequestCache class];
        SEL write_sel = @selector(cacheForURL:);
        IMP write_imp = [cache_class methodForSelector:write_sel];

      那么新的读取数据的方法为:

    - (NSData *)newMethodCacheForURL:(NSURL *url){
         return write_imp(cache_class,write_sel,url);
    }

        但是,出现了(IMP)Too many arguments to function call, expected 0, have 3的错误,随后写了几个小demo,发现IMP的方法全都会出现这样的错误,应该是编译器的问题,需要将下图标蓝的位置改为NO:

       网上许多调用objc_msgsend方法也出现了这个问题,也是在这个地方更改,看报告问题的相应时间都是在2015年1月前后,应该之前这个值默认是NO,在15年年初的一个xcode版本升级中改成的YES。

  • 相关阅读:
    寄存器详解
    Sleep(0)的妙用
    源码分析之Dictionary笔记
    ASP.NET Core框架的本质
    Dictionary实现(收藏的)
    微软的判断一个数是不是质数的算法
    C#性能优化:延迟初始化Lazy
    C#3 分部方法,简单标记一下
    单例下并发的情况下访问私有变量的一个典型问题
    BeforeFieldInit的小叙
  • 原文地址:https://www.cnblogs.com/Kelphizy/p/4552496.html
Copyright © 2011-2022 走看看