之前写了1片关于编译SDWebImage报错解决方法的文章:
http://blog.csdn.net/cuibo1123/article/details/39434015
结果很多人问这个问题的缘由,那就在这里给大家说1说好了,分析思路1并送上(不过我还是建议大家自己动手去分析)。
首先,如果新建工程,依照SDWebImage的方式声明输出口并援用:
这段代码不会出现任何问题,并可以编译正常。
那末,为何一样的代码在SDWebImage里却有以下提示?
Use of undeclared identifier '_executing';
Use of undeclared identifier '_finished';
思路就是去找SDWebImage的SDWebImageDownloaderOperation类和自己的代码有甚么不同。很容易发现,SDWebImageDownloaderOperation继承的父类是NSOperation,那末,把我们自己的测试代码也继承自NSOperation,你会发现测试代码这时候会报一样的毛病了。好了,缘由定位在NSOperation,看看这个接口吧,打开NSOperation.h,在声明中会发现以下两行:
@property (readonly, getter=isExecuting) BOOL executing;
@property (readonly, getter=isFinished) BOOL finished;
好了,问题就出在这里。NSOperation里声明了两个同名属性,并且是readonly,所以在SDWebImageDownloaderOperation里使用_executing = NO修改就会提示毛病了,而在SDWebImageDownloaderOperation的扩大中使用assign优先级是低于继承的(猜想)。这就是问题的由来。
至于老版本的xcode为何不报错,这可能要归结到xcode本身了,也许老版本声明readonly模式一样会产生_executing,但是xcode6在readonly模式时优化掉了_executing变量,有兴趣可以自行实验或看编译进程文件。这里就不继续解读了。
原创内容,转载请注明出处:http://blog.csdn.net/cuibo1123
^^