一些常見warning的原因和解決方法


  在入職三周后,終於趕齊了接手項目落下兩個月的項目,有了一些自己的空閑時間對項目進行整理。主要整理包括類目的整合,從原來一個系統文件夾下幾百個文件整改為以MVC設計思想為原則的分文件夾整理類目,井然有序了很多,也不需要再用查找關鍵字來尋找想要找的類了,中間因為類目文件位置的修改而出現了很多問題。其次還包括一些代碼的整合,包括一些多個類中都需要使用的代碼,我們可以創建一個工具類來封裝調用,或者使用一個根類來集成代碼。

  在做完了以上工作后,我又把關注重點放在了150多個warning之上。作為一個強迫症,是無法容忍這么多warning存在在我的程序里面的。所以,我走上了漫長的修改警告warning之路。

 

1. Initialization of immutable value 'XXX' was never used; consider replacing with assignment to '_' or removing it.

  直譯:不可變量'XXX'的初始值並沒有用到;考慮下用'_'替代或移除它。

  分析:直譯夠簡單明了了。我們可能在之前創建了一個變量/常量,賦予了它值並准備使用;然而我們由於種種原因並沒有用到這個值。出於對內存優化的考慮,系統提示我們使用或干掉它。

  解決方法:1.直接刪掉這個值(或者你可以注釋掉以防用到);2.確認我們將來可能會用到這個值而暫時用不到,那就點一下黃色"warning",系統會幫你替換為"_"。

 

2. 'init(start:end:)' is deprecated: it will be removed in Swift 3.  Use the '..<' operator.

  直譯:'XXX'已經被廢棄了:它將在Swift 3時被移除。使用'XXX'方法。

  分析:當我們看到"is deprecated"的時候,代表我們當前使用的屬性或方法被廢棄了。警告中一般帶有建議替換的方法或屬性名稱。替換就可以了。

  解決方法:點擊當前方法進入源文件,找到新的方法,分析新方法的使用方式后替換廢棄的方法。

 

3.  Variable 'XXX' was never mutated; consider changing to 'let' constant

  直譯:變量'XXX'的值從未改變;考慮改變為'let'修飾的常量。

  分析:這是Swift中出現的錯誤。我們在聲明一個值得時候,要同時聲明這個值為"var"變量或"let"常量。若聲明為變量而實際值未改變過時,會出現上述警告讓你改為"let";若聲明為變量而值改變過時,會出現紅色報錯提示你改為"var"。

  解決方法:點擊黃色警告,在出現系統提示后回車即可替換。

 

4. Use '#selector' instead of explicitly constructing a 'Selector'

  直譯:使用'#selector'代替明確的構造一個'Selector'結構體。

  分析:這個也是Swift特有的問題,不過我想說的'instead of'不是。一般這種情況的產生是因為語言版本的更新而造成了一部分語法的不同。使用'instead of'之前的方式即可。

  解決方法:若可以,則直接點擊警告然后回車替換。若不可以,則看警告信息知道要替換的語法后,自己替換。

 

5. The image set name "XXX" is used by multiple image sets.

  直譯:名稱為"XXX"的圖片組重復了。

  分析:這個警告的意思是,你引入了兩個或多個相同名稱的圖片組。一般發生在我們獲得新的切圖並放入工程之后。

  解決方法:刪除重名的一組圖片,或將其中一組圖片修改名字。

 

6. The image set "XXX" has an unassigned child.

  直譯:名為"XXX"圖片的圖片組有一個不可同化的子圖片。

  分析:我們都知道iOS因為屏幕分辨率的問題,切圖一般有三套,我們通過在一組圖片中的每張圖片后添加后綴@2x/@3x來區分每張圖片不同分辨率對應的不同屏幕。但如果我們並沒有這樣命名,就會出現上述問題。

  解決方法:將未設置分辨率比例的圖片設置一下,或者刪掉這個圖片。

 

7. The image set "XXX" references a file "XXX.JPG", but that file does not have a valid extension.

  直譯:圖片組"XXX"涉及到了文件"XXX.JPG",但是這個文件沒有一個正當的擴展名。

  分析:iOS支持的圖片類型主要有"JPG, JPEG, GIF, PNG",這么看貌似也有"JPG"格式。但是iOS支持的擴展名都是小寫。

  解決方法:將".JPG"改為".jpg"即可。

  

8. AppIcon.appiconset/logo_83.5.png is 84x84 but should be 167x167.

  直譯:App的標示圖片分辨率是84x84但是應該是167x167。

  解決方法:放置合適分辨率的圖片。

 

9. Warning: Multiple build commands for output file fanhui@2x.png

  直譯:當我們導出文件時出現了多樣的控制。

  分析:這個錯誤發生在我們直接將文件加入工程,而不是放在Assets.xcassets中的時候可能出現(對比上述第5個問題),原因是我們重復放入了兩個相同名稱的圖片。

  解決方法:刪掉一個圖片或者將其中一個圖片改名。

 

10. Main.storyboard Frame for "XXX" will be different at run time.

  直譯:在"Main.storyboard"上的"XXX"控件的框架在運行時會與現在不一樣。

  分析:這是因為我們在設置完成控件的約束后沒有Update Frames。

  解決方案:Update Frames就好。

 

11. Unsupported Configuration: “View Controller“ is unreachable because it has no entry points, and no identifier for runtime access via -[UIStoryboard instantiateViewControllerWithIdentifier:].

  直譯:不支持的設置:"View Controller"是不能被取到的,因為它沒有程序入口指針,也沒有標識符以供方法[UIStoryboard instantiateViewControllerWithIdentifier:]在運行時獲取。

  分析:相當於你創了一個UIViewController缺什么都沒設置。

  解決方案:干掉,或者起個標識符並使用。

 

  目前尚有一些warning沒有解決,另外還有些第三方框架的警告沒有修改。不過已經從150修改到27了。希望大家在寫代碼的時候遵循格式,不要無視警告,影響整個程序代碼的效率與整潔。

 

12.Warning:

  程序一運行之后打印:objc[56768]: Class PLBuildVersion is implemented in both /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/PrivateFrameworks/AssetsLibraryServices.framework/AssetsLibraryServices (0x1140fd998) and /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/PrivateFrameworks/PhotoLibraryServices.framework/PhotoLibraryServices (0x113f1f880). One of the two will be used. Which one is undefined.

  原因很簡單,你使用了 <AssetsLibrary/AssetsLibrary.h> ( iOS9.0之后廢棄 ) 或者 <Photos/Photos.h> (iOS8.0之后可以使用)這兩個程序之一,並且你的程序的最低版本配置在8.0之上;或者你使用了其他兩個相同功能的蘋果官方framework。它的意思就是兩個類重名了,但是包含在兩個framework里面。

  這個問題暫時無法避免,但是沒有關系不影響運行。PLBuildVersion在這兩個框架里都是一樣的,不影響實際運行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM