之前寫了1片關(guān)于編譯SDWebImage報錯解決方法的文章:
http://blog.csdn.net/cuibo1123/article/details/39434015
結(jié)果很多人問這個問題的緣由,那就在這里給大家說1說好了,分析思路1并送上(不過我還是建議大家自己動手去分析)。
首先,如果新建工程,依照SDWebImage的方式聲明輸出口并援用:
這段代碼不會出現(xiàn)任何問題,并可以編譯正常。
那末,為何一樣的代碼在SDWebImage里卻有以下提示?
Use of undeclared identifier '_executing';
Use of undeclared identifier '_finished';
思路就是去找SDWebImage的SDWebImageDownloaderOperation類和自己的代碼有甚么不同。很容易發(fā)現(xiàn),SDWebImageDownloaderOperation繼承的父類是NSOperation,那末,把我們自己的測試代碼也繼承自NSOperation,你會發(fā)現(xiàn)測試代碼這時候會報一樣的毛病了。好了,緣由定位在NSOperation,看看這個接口吧,打開NSOperation.h,在聲明中會發(fā)現(xiàn)以下兩行:
@property (readonly, getter=isExecuting) BOOL executing;
@property (readonly, getter=isFinished) BOOL finished;
好了,問題就出在這里。NSOperation里聲明了兩個同名屬性,并且是readonly,所以在SDWebImageDownloaderOperation里使用_executing = NO修改就會提示毛病了,而在SDWebImageDownloaderOperation的擴大中使用assign優(yōu)先級是低于繼承的(猜想)。這就是問題的由來。
至于老版本的xcode為何不報錯,這可能要歸結(jié)到xcode本身了,也許老版本聲明readonly模式一樣會產(chǎn)生_executing,但是xcode6在readonly模式時優(yōu)化掉了_executing變量,有興趣可以自行實驗或看編譯進程文件。這里就不繼續(xù)解讀了。
原創(chuàng)內(nèi)容,轉(zhuǎn)載請注明出處:http://blog.csdn.net/cuibo1123
^^