這篇文章中收錄了Xcode出現的各類錯誤,並對錯誤給出了正確的解決方案,以便幫助遇到困難的朋友。ios
文章由做者劉小壯維護並持續更新,有新的問題而且文章中沒有收錄的,能夠在下面評論區中提出,我會收錄在文章中供你們參考。若是有問題不能解決的,也能夠在下方評論區中提出,我會盡力幫助解決,而且將解決方案添加到文章中供其餘人蔘考。git
"file/file.h" file not found
若是遇到這種類型的問題報錯,能夠分爲三部來解決,由簡到複雜一步一步來,直到解決問題位置。
1. 點擊Xcode -> Project -> Clean清除緩存或者使用⌘ + ⇧ + k快捷鍵來清除。
2. 點擊Xcode -> Window -> Projects 清除Derived Data的緩存,在清除緩存以前先完全退出Xcode,而後直接刪除緩存文件夾。
3. 再Build Settings -> Header Search Paths 添加路徑,$(SRCROOT)/項目名稱/文件路徑。
緩存
若是上面這三種方法都沒有解決問題,就要考慮一下文件是否存在或者導入方式是否有錯誤了。例如:# include<>
和# include""
、# import<>
和# import""
的導入方式是否有錯誤。app
ld: -pie can only be used when targeting iOS 4.2 or later clang: error: linker command failed with exit code 1 (use -v to see invocation)
首先注意:-pie can only be used when targeting iOS 4.2 or later -pie
只能在ios4.2或更高版本上使用,因此你能夠更改工程Deployment Info —> Depoyment Target
ide
若是你的IDE報了以下錯誤:svn
auto property synthesis is synthesizing property not explicitly synthesized
解決方法:
project -> build settings -> Apple LLVM 6.0 - Warnings - Objective C -> Implicit Synthesized Properties -> NO.
工具
這樣就會消除全部的property
警告了。測試
the file 「XXX」 could not be opened because you don't have permission to view it
今天使用Xcode6,忽然提示我"the file 「XXX」 could not be opened because you don't have permission to view it"
說我沒有權限。
能夠在Build settings->Product Name
項修改.Product Name
項默認是$(TARGET_NAME)
,能夠修改任意app名稱:優化
若是遇到上面的狀況,還有一種方式解決:
Project —> Build Setting —> Build Options —> Compiler for C/C++/Objective-C
中 修改這一項,變成Default Compiler(Apple LLVM 6.0)
ui
這種方法能夠解決不少由於編譯器引起的問題。
有的時候會遇到這樣類型的錯誤:
property type ‘id <maintabbardelegate>’ is incompatible with type ‘id <uitabbardelegate>’ inherited from ‘uitabbar’
UIKit 代理
本身定義的代理
這是由於本身的代理屬性名和繼承的父類代理屬性名重名了,這種狀況只須要把本身代理屬性名更改就能夠。
可是這種方法還不是很好的解決方式,最好的解決方式是在定義代理的時候,繼承自父類的代理。這樣作的好處是,符合Objective-C
中的繼承的特性;並且外界使用當前類的代理的時候,能夠經過遵照當前類的代理,達到將父類的代理也遵照,更加方便外界使用。並且蘋果官方也是這樣作的。
在storyboard
中,由controller A
跳轉到controller B
的時候而後報錯:
Warning: Attempt to present *** on *** whose view is not in the window hierarchy!
大體分析一下,應該是這麼回事情,在controller a
的viewDidLoad
裏面直接跳轉controller b
,而後致使在顯示controller b
的時候也調用了controller a
來顯示,而後發現這個window
的層次結構就錯亂了。
在controller a
中跳轉的時候,要在viewDidLoad
以及viewDidAppear
以後才能跳轉,因此能夠本身想辦法延時跳轉,而不是直接跳轉。也能夠將這個方法寫在其餘位置,根據自身狀況而定。
The document "ViewController.xib" could not be opened. Unrecognized file content.
不少狀況都會形成這個錯誤,最多見的是由於svn
或者git
等版本控制工具進行代碼update
的時候形成的。咱們解決完衝突以後將Xcode退出,刪除緩存,而後在右邊的列表裏找到Open AS -> Interface Builder XIB Documents
就能夠了。
這個問題應該算是Xcode的一個bug
,跟咱們並無關係。
import <framework/framework.h> file not found
咱們導入一個新的framework
以後報file not found
錯誤,或者當前framework
致使其餘framework
報file not found
錯誤,這都是由於路徑致使的錯誤,咱們須要指定一下程序的路徑。
解決方法:在Build Settings -> Framework Search Paths
添加路徑,$(SRCROOT)/項目名稱/文件路徑/文件名.framework
storyboardd references cannot be the destinations of relationship segues prior to ios 9.0
iOS9以後蘋果添加了一個新特性-Storyboard References,這個特性若是報以上錯誤,是由於這個新特性只支持iOS9及以上版本,須要將Xcode編譯最低版本設置爲iOS9。
Deployment Target
This application's application-identifier entitlement does not match that of the installed application. These values must match for an upgrade to be allowed.
設備上已經有一個和當前運行程序相同identifier程序,須要將設備上相同identifier的程序刪除,或者修改當前運行程序的Identifier,而後在從新運行便可。
Identifier
項目名 does not have an architecture that 設備名 can execute.
這個問題主要是由於項目設置的ARM指令集,比設備指令集高,也就是項目沒有兼容低版本設備的指令集致使的。因此須要咱們設置更低的指令集來兼容低版本設備,這個設備版本不是iOS系統版本,而是硬件的版本,例如iPhone五、iPhone6這樣的設備。
ARM指令集
若是從新設置了設備指令集,仍是不能正常運行程序,而且出現下面的錯誤:
failed to send the handshake ack
若是從錯誤信息上來看,是一個握手符號發送失敗,可是並非這樣的,也不是由於網的問題。這主要是由於咱們出現上面ARM指令集錯誤以後致使的,須要咱們手動還原系統設置。
具體操做 : 通用 -> 還原 -> 還原全部設置 (這個操做越獄機慎重)
Variables View (控制檯變量) 不顯示變量的值和內存地址,不少對象都顯示爲nil,而其實是有值的。
這主要是由於咱們將當前工程的Edit Scheme
的Build Configuration
設置爲了release
模式,在release
模式下編譯器會模擬真機運行狀態,會對一些調試參數進行優化,包括不顯示Variables View
變量。
因此解決方案就是咱們將Build Configuration
的release
模式改成debug
模式,變量值和內存地址就出來了。
Unknown type name ‘ViewController’;did you mean ‘UIViewController’?
或
Unknown type name ‘ViewController’;
這是由於在代碼中的兩個類,使用#import
直接或間接的循環引用致使的,這個錯誤是發生在編譯期的。例如classA
中#import
了classB
,classB
中#import
了classA
,或中間隔了幾層的循環引用。
解決方式是找到循環引用的類,而後在產生循環引用的任意一個類的.h
文件中使用@class
的方式引用,而後在類的.m
中使用#import
引用就能夠解決。
Could not find Developer Disk Image
問題所在:
這種狀況通常都是出如今真機調試的過程當中,是由於測試設備系統版本比Xcode
的可運行版本高,因此致使Xcode
找不到對應的磁盤映射文件。
解決方法1:
對於這樣的問題,咱們能夠經過升級Xcode
來解決,只要把Xcode
升級到最高版本這個問題就解決了。由於最新的Xcode
可運行版本始終都是比最新的iOS
系統高或持平,因此這種方法能夠解決,並且這也是蘋果但願的。
可是升級Xcode
的過程當中會致使不能打開Xcode
,嚴重影響咱們的工做,並且Xcode
體積比較大,升級過程對網速的要求比較高。並且下載一個Xcode
以後也不必定馬上能用,有時候Xcode
升級了,可是Mac操做系統版本不能支持Xcode
,還要升級Mac操做系統,又是一天過去了。。。
解決方法2:(我的推薦)
對於這個問題,咱們能夠考慮添加iOS
系統對應的 DeveloperDiskImage
文件解決,這也就是上面咱們說的Xcode
磁盤映射文件,下載並添加這個文件就能夠了。
具體文件能夠直接Google下載一個,下載以後直接放在下面的目錄便可。例如我如今要運行iOS9.3.1
的系統,我就下載一個文件名爲9.3 (13E230)
的文件,而後放在這個目錄,就能夠正常運行真機了。
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/
一個DeveloperDiskImage
文件能夠運行當前中等版本號的全部子版本號,例如此次更新的9.3.1
系統的DeveloperDiskImage
文件,就能夠運行9.3.0
—9.3.9
的全部9.3
開頭的子版本號,對於其餘系統版本同理。
Xcode升級策略:
對於Xcode
的升級,我本身的想法是隻有在6.xx
和7.xx
這樣的大版本更新,我纔會升級Xcode
,其餘小版本我都不會去升級。爲了保證真機運行,每次更新iOS
系統後,我都會採用上面的方式來升級Xcode
磁盤映射文件,但Xcode
我不會去升級。
這主要仍是由於Xcode
體積比較大,升級一次確實不容易,並且頻繁升級Xcode
也沒有什麼大的變化。通常在6.xx
和7.xx
這樣的大版本更新,Xcode
纔會有比較大的變化,這時候我纔會選擇升級Xcode
。
iPhone6 is busy: Processing symbol files Xcode will continue when iPhone6 is finished
Processing symbol files
真機運行時,常常會出現上面的錯誤,可是項目的配置、證書、設備什麼的都沒問題啊。
其實從Xcode
上面的進度信息也能夠看到,Xcode
正在處理符號文件。Xcode
每次鏈接新設備後,都會進行這步操做,只有第一次鏈接會這樣,以後就不會了。因此咱們要作的就是,等。。。