標籤:xcode6 sdwebimage undeclared sdwebimagedownloader
之前寫了一片關於編譯SDWebImage報錯解決方案的文章:
http://blog.csdn.net/cuibo1123/article/details/39434015
結果很多人問這個問題的原因,那就在這裡給大家說一說好了,分析思路一併送上(不過我還是建議大家自己動手去分析)。
首先,如果建立工程,按照SDWebImage的方式聲明輸出口並引用:
- @interface ZCTest ()
- @property (assign, nonatomic, getter = isExecuting) BOOL executing;
- @property (assign, nonatomic, getter = isFinished) BOOL finished;
- @end
-
- @implementation ZCTest
- - (id)init
- {
- if ((self = [super init]))
- {
- _executing = NO;
- _finished = NO;
- }
- return self;
- }
- @end
這段代碼不會出現任何問題,並可以編譯正常。
那麼,為什麼同樣的代碼在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
^^
Xcode6編譯SDWebImage報錯原因分析(SDWebImageDownloaderOperation.m錯誤)