iOS開(kāi)發(fā)總結(jié)-Xcode常見(jiàn)錯(cuò)誤
2018-07-20 來(lái)源:編程學(xué)習(xí)網(wǎng)

這篇文章中收錄了Xcode出現(xiàn)的各種錯(cuò)誤,并對(duì)錯(cuò)誤給出了正確的解決方案,以便幫助遇到困難的朋友。
文章由作者劉小壯維護(hù)并持續(xù)更新,有新的問(wèn)題并且文章中沒(méi)有收錄的,可以在下面評(píng)論區(qū)中提出,我會(huì)收錄在文章中供大家參考。如果有問(wèn)題不能解決的,也可以在下方評(píng)論區(qū)中提出,我會(huì)盡力幫助解決,并且將解決方案添加到文章中供其他人參考。
占位圖
"file/file.h" file not found
如果遇到這種類(lèi)型的問(wèn)題報(bào)錯(cuò),可以分為三部來(lái)解決,由簡(jiǎn)到復(fù)雜一步一步來(lái),直到解決問(wèn)題位置。
1. 點(diǎn)擊Xcode -> Project -> Clean清除緩存或者使用? + ? + k快捷鍵來(lái)清除。
2. 點(diǎn)擊Xcode -> Window -> Projects 清除Derived Data的緩存,在清除緩存之前先徹底退出Xcode,然后直接刪除緩存文件夾。
3. 再Build Settings -> Header Search Paths 添加路徑,$(SRCROOT)/項(xiàng)目名稱(chēng)/文件路徑。
如果上面這三種方法都沒(méi)有解決問(wèn)題,就要考慮一下文件是否存在或者導(dǎo)入方式是否有錯(cuò)誤了。例如: # include<> 和 # include"" 、 # import<> 和 # import"" 的導(dǎo)入方式是否有錯(cuò)誤。
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報(bào)了如下錯(cuò)誤:
auto property synthesis is synthesizing property not explicitly synthesized
解決方法:
project -> build settings -> Apple LLVM 6.0 - Warnings - Objective C -> Implicit Synthesized Properties -> NO.
這樣就會(huì)消除所有的 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" 說(shuō)我沒(méi)有權(quán)限。
可以在 Build settings->Product Name 項(xiàng)修改 .Product Name 項(xiàng)默認(rèn)是 $(TARGET_NAME) ,可以修改任意app名稱(chēng):
如果遇到上面的情況,還有一種方式解決:
Project —> Build Setting —> Build Options —> Compiler for C/C++/Objective-C 中 修改這一項(xiàng),變成 Default Compiler(Apple LLVM 6.0)
這種方法可以解決很多因?yàn)榫幾g器引發(fā)的問(wèn)題。
有的時(shí)候會(huì)遇到這樣類(lèi)型的錯(cuò)誤:
property type ‘id <maintabbardelegate>’ is incompatible with type ‘id <uitabbardelegate>’ inherited from ‘uitabbar’
UIKit 代理
自己定義的代理
這是因?yàn)樽约旱拇韺傩悦屠^承的父類(lèi)代理屬性名重名了,這種情況只需要把自己代理屬性名更改就可以。
但是這種方法還不是很好的解決方式,最好的解決方式是在定義代理的時(shí)候,繼承自父類(lèi)的代理。這樣做的好處是,符合 Objective-C 中的繼承的特性;而且外界使用當(dāng)前類(lèi)的代理的時(shí)候,可以通過(guò)遵守當(dāng)前類(lèi)的代理,達(dá)到將父類(lèi)的代理也遵守,更加方便外界使用。而且蘋(píng)果官方也是這樣做的。
在 storyboard 中,由 controller A 跳轉(zhuǎn)到 controller B 的時(shí)候然后報(bào)錯(cuò):
Warning: Attempt to present *** on *** whose view is not in the window hierarchy!
大致分析一下,應(yīng)該是這么回事情,在 controller a 的 viewDidLoad 里面直接跳轉(zhuǎn) controller b ,然后導(dǎo)致在顯示 controller b 的時(shí)候也調(diào)用了 controller a 來(lái)顯示,然后發(fā)現(xiàn)這個(gè) window 的層次結(jié)構(gòu)就錯(cuò)亂了。
在 controller a 中跳轉(zhuǎn)的時(shí)候,要在 viewDidLoad 以及 viewDidAppear 之后才能跳轉(zhuǎn),所以可以自己想辦法延時(shí)跳轉(zhuǎn),而不是直接跳轉(zhuǎn)。也可以將這個(gè)方法寫(xiě)在其他位置,根據(jù)自身情況而定。
The document "ViewController.xib" could not be opened. Unrecognized file content.
很多情況都會(huì)造成這個(gè)錯(cuò)誤,最常見(jiàn)的是因?yàn)?svn 或者 git 等版本控制工具進(jìn)行代碼 update 的時(shí)候造成的。我們解決完沖突之后將Xcode退出,刪除緩存,然后在右邊的列表里找到 Open AS -> Interface Builder XIB Documents 就可以了。
這個(gè)問(wèn)題應(yīng)該算是Xcode的一個(gè) bug ,跟我們并沒(méi)有關(guān)系。
import <framework/framework.h> file not found
我們導(dǎo)入一個(gè)新的 framework 之后報(bào) file not found 錯(cuò)誤,或者當(dāng)前 framework 導(dǎo)致其他 framework 報(bào) file not found 錯(cuò)誤,這都是因?yàn)槁窂綄?dǎo)致的錯(cuò)誤,我們需要指定一下程序的路徑。
解決方法:在 Build Settings -> Framework Search Paths 添加路徑, $(SRCROOT)/項(xiàng)目名稱(chēng)/文件路徑/文件名.framework
storyboardd references cannot be the destinations of relationship segues prior to ios 9.0
iOS9之后蘋(píng)果添加了一個(gè)新特性-Storyboard References,這個(gè)特性如果報(bào)以上錯(cuò)誤,是因?yàn)檫@個(gè)新特性只支持iOS9及以上版本,需要將Xcode編譯最低版本設(shè)置為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.
設(shè)備上已經(jīng)有一個(gè)和當(dāng)前運(yùn)行程序相同identifier程序,需要將設(shè)備上相同identifier的程序刪除,或者修改當(dāng)前運(yùn)行程序的Identifier,然后在重新運(yùn)行即可。
Identifier
項(xiàng)目名 does not have an architecture that 設(shè)備名 can execute.
這個(gè)問(wèn)題主要是因?yàn)轫?xiàng)目設(shè)置的ARM指令集,比設(shè)備指令集高,也就是項(xiàng)目沒(méi)有兼容低版本設(shè)備的指令集導(dǎo)致的。所以需要我們?cè)O(shè)置更低的指令集來(lái)兼容低版本設(shè)備,這個(gè)設(shè)備版本不是iOS系統(tǒng)版本,而是硬件的版本,例如iPhone5、iPhone6這樣的設(shè)備。
ARM指令集
如果重新設(shè)置了設(shè)備指令集,還是不能正常運(yùn)行程序,并且出現(xiàn)下面的錯(cuò)誤:
failed to send the handshake ack
如果從錯(cuò)誤信息上來(lái)看,是一個(gè)握手符號(hào)發(fā)送失敗,但是并不是這樣的,也不是因?yàn)榫W(wǎng)的問(wèn)題。這主要是因?yàn)槲覀兂霈F(xiàn)上面ARM指令集錯(cuò)誤之后導(dǎo)致的,需要我們手動(dòng)還原系統(tǒng)設(shè)置。
具體操作 : 通用 -> 還原 -> 還原所有設(shè)置 (這個(gè)操作越獄機(jī)慎重)
Variables View (控制臺(tái)變量) 不顯示變量的值和內(nèi)存地址,很多對(duì)象都顯示為nil,而實(shí)際上是有值的。
這主要是因?yàn)槲覀儗?dāng)前工程的 Edit Scheme 的 Build Configuration 設(shè)置為了 release 模式,在 release 模式下編譯器會(huì)模擬真機(jī)運(yùn)行狀態(tài),會(huì)對(duì)一些調(diào)試參數(shù)進(jìn)行優(yōu)化,包括不顯示 Variables View 變量。
所以解決方案就是我們將 Build Configuration 的 release 模式改為 debug 模式,變量值和內(nèi)存地址就出來(lái)了。
Unknown type name ‘ViewController’;did you mean ‘UIViewController’?
或
Unknown type name ‘ViewController’;
這是因?yàn)樵诖a中的兩個(gè)類(lèi),使用 #import 直接或間接的循環(huán)引用導(dǎo)致的,這個(gè)錯(cuò)誤是發(fā)生在編譯期的。例如 classA 中 #import 了 classB , classB 中 #import 了 classA ,或中間隔了幾層的循環(huán)引用。
解決方式是找到循環(huán)引用的類(lèi),然后在產(chǎn)生循環(huán)引用的任意一個(gè)類(lèi)的 .h 文件中使用 @class 的方式引用,然后在類(lèi)的 .m 中使用 #import 引用就可以解決。
Could not find Developer Disk Image
問(wèn)題所在:
這種情況一般都是出現(xiàn)在真機(jī)調(diào)試的過(guò)程中,是因?yàn)闇y(cè)試設(shè)備系統(tǒng)版本比 Xcode 的可運(yùn)行版本高,所以導(dǎo)致 Xcode 找不到對(duì)應(yīng)的磁盤(pán)映射文件。
解決方法1:
對(duì)于這樣的問(wèn)題,我們可以通過(guò)升級(jí) Xcode 來(lái)解決,只要把 Xcode 升級(jí)到最高版本這個(gè)問(wèn)題就解決了。因?yàn)樽钚碌?Xcode 可運(yùn)行版本始終都是比最新的 iOS 系統(tǒng)高或持平,所以這種方法可以解決,而且這也是蘋(píng)果希望的。
但是升級(jí) Xcode 的過(guò)程中會(huì)導(dǎo)致不能打開(kāi) Xcode ,嚴(yán)重影響我們的工作,而且 Xcode 體積比較大,升級(jí)過(guò)程對(duì)網(wǎng)速的要求比較高。而且下載一個(gè) Xcode 之后也不一定立刻能用,有時(shí)候 Xcode 升級(jí)了,但是 Mac 操作系統(tǒng)版本不能支持 Xcode ,還要升級(jí) Mac 操作系統(tǒng),又是一天過(guò)去了。。。
解決方法2:(個(gè)人推薦)
對(duì)于這個(gè)問(wèn)題,我們可以考慮添加 iOS 系統(tǒng)對(duì)應(yīng)的 DeveloperDiskImage 文件解決,這也就是上面我們說(shuō)的 Xcode 磁盤(pán)映射文件,下載并添加這個(gè)文件就可以了。
具體文件可以直接 Google 下載一個(gè),下載之后直接放在下面的目錄即可。例如我現(xiàn)在要運(yùn)行 iOS9.3.1 的系統(tǒng),我就下載一個(gè)文件名為 9.3 (13E230) 的文件,然后放在這個(gè)目錄,就可以正常運(yùn)行真機(jī)了。
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/
一個(gè) DeveloperDiskImage 文件可以運(yùn)行當(dāng)前中等版本號(hào)的所有子版本號(hào),例如這次更新的 9.3.1 系統(tǒng)的 DeveloperDiskImage 文件,就可以運(yùn)行 9.3.0 — 9.3.9 的所有 9.3 開(kāi)頭的子版本號(hào),對(duì)于其他系統(tǒng)版本同理。
Xcode升級(jí)策略:
對(duì)于 Xcode 的升級(jí),我自己的想法是只有在 6.xx 和 7.xx 這樣的大版本更新,我才會(huì)升級(jí) Xcode ,其他小版本我都不會(huì)去升級(jí)。為了保證真機(jī)運(yùn)行,每次更新 iOS 系統(tǒng)后,我都會(huì)采用上面的方式來(lái)升級(jí) Xcode 磁盤(pán)映射文件,但 Xcode 我不會(huì)去升級(jí)。
這主要還是因?yàn)?Xcode 體積比較大,升級(jí)一次確實(shí)不容易,而且頻繁升級(jí) Xcode 也沒(méi)有什么大的變化。一般在 6.xx 和 7.xx 這樣的大版本更新, Xcode 才會(huì)有比較大的變化,這時(shí)候我才會(huì)選擇升級(jí) Xcode 。
iPhone6 is busy: Processing symbol files
Xcode will continue when iPhone6 is finished
Processing symbol files
真機(jī)運(yùn)行時(shí),經(jīng)常會(huì)出現(xiàn)上面的錯(cuò)誤,但是項(xiàng)目的配置、證書(shū)、設(shè)備什么的都沒(méi)問(wèn)題啊。
其實(shí)從 Xcode 上面的進(jìn)度信息也可以看到, Xcode 正在處理符號(hào)文件。 Xcode 每次連接新設(shè)備后,都會(huì)進(jìn)行這步操作,只有第一次連接會(huì)這樣,之后就不會(huì)了。所以我們要做的就是,等。。。
Charles無(wú)法抓包
在 Mac 上下載 Charles 后,直接就可以抓包,而手機(jī)上配置代理后也可以抓包。
但是有的時(shí)候 Charles 會(huì)出現(xiàn)無(wú)法抓包的情況,重新卸載后再安裝,還是無(wú)法抓包。
遇到這樣的情況,可以按照下面的步驟,檢查一下是否是配置的問(wèn)題。
1. 查看Charles下面兩個(gè)選項(xiàng)是否勾選,如果勾選將其取消。
Proxy -> Proxy Settings -> Enable transparent HTTP proxying
Proxy -> SSL Proxying Settings -> ->SSL Proxying -> Enable SSL Proxying
2. 查看Charles下面選項(xiàng)是否勾選
Proxy -> Mac OS X Proxy
3. 如果用過(guò)Lantern或者其他翻墻工具,需要檢查下面選項(xiàng)是否勾選,很多翻墻工具會(huì)配置下面選項(xiàng)。
系統(tǒng)偏好設(shè)置 -> 網(wǎng)絡(luò) -> 高級(jí) -> 自動(dòng)代理配置
我不能使用 Charles 就是因?yàn)榈谌N情況,我做的就是直接將其取消,測(cè)試了一下還可以照常翻墻。
ld: library not found for -lBeeHive
clang: error: linker command failed with exit code 1 (use -v to see invocation)
解決方案
這種問(wèn)題一般都是缺少庫(kù)文件所導(dǎo)致的,例如使用某個(gè)第三方庫(kù),但沒(méi)有導(dǎo)入其文件,就會(huì)報(bào)這樣的錯(cuò)。所以需要根據(jù)提示信息,找到缺失的庫(kù)文件,并將其拖入工程中即可。
如果使用了 CocoaPods ,那就是沒(méi)有更新 podfile 文件所導(dǎo)致的,執(zhí)行 pod 命令并重新打開(kāi)工程即可。
[!] The master repo requires CocoaPods 1.0.0 -(currently using 0.39.0)
Update CocoaPods, or checkout the appropriate tag in the repo.
升級(jí) Xcode 8 和 Mac10.12 之后,在 pod update 的時(shí)候發(fā)現(xiàn)報(bào)這個(gè)錯(cuò)誤。
按照錯(cuò)誤提示來(lái)說(shuō)是升級(jí) CocoaPods ,嘗試之后升級(jí)失敗。后來(lái)以為是 gem 的問(wèn)題,打印了一下 gem 的地址,也沒(méi)什么問(wèn)題。
http://ruby.taobao.org/
https://ruby.taobao.org/
趕快 Google 查了一下是什么問(wèn)題。后來(lái)查到在 Mac10.11 之后,系統(tǒng)會(huì)把 CocoaPods 移到 /usr/local/bin 路徑下。所以又重新安裝了一遍 CocoaPods ,并指定了路徑,就可以了。
sudo gem install -n /usr/local/bin cocoapods
之前一般都是通過(guò)不指定路徑的方式安裝的,所以會(huì)安裝到 CocoaPods 默認(rèn)路徑下。
sudo gem install cocoapods
如果重新安裝 CocoaPods 之后,還是報(bào)下面的錯(cuò)誤,那就需要改一下 Podfile 文件。
[!] The dependency `ReactiveCocoa (= 2.0)` is not used in any concrete target.
給 Podfile 文件添加上 target ,再運(yùn)行 pod update 就沒(méi)問(wèn)題了。
target “Project” do
pod 'ReactiveCocoa' , '2.0'
end
來(lái)自:http://www.jianshu.com/p/997ae94510c8
標(biāo)簽: Google ssl 代碼 權(quán)限 網(wǎng)絡(luò)
版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。