iOS開發(fā)常見錯誤總結(jié)

配圖

這篇文章中收錄了Xcode出現(xiàn)的各種錯誤,并對錯誤給出了正確的解決方案,以便幫助遇到困難的朋友。

文章由作者劉小壯維護(hù)并持續(xù)更新,有新的問題并且文章中沒有收錄的,可以在下面評論區(qū)中提出,我會收錄在文章中供大家參考。如果有問題不能解決的,也可以在下方評論區(qū)中提出,我會盡力幫助解決,并且將解決方案添加到文章中供其他人參考。


"file/file.h" file not found

如果遇到這種類型的問題報錯,可以分為三部來解決,由簡到復(fù)雜一步一步來,直到解決問題位置。

  1. 點擊Xcode -> Project -> Clean清除緩存或者使用? + ? + k快捷鍵來清除。
  2. 點擊Xcode -> Window -> Projects清除Derived Data的緩存,在清除緩存之前先徹底退出Xcode,然后直接刪除緩存文件夾。
  3. Build Settings -> Header Search Paths添加路徑,$(SRCROOT)/項目名稱/文件路徑

如果上面這三種方法都沒有解決問題,就要考慮一下文件是否存在或者導(dǎo)入方式是否有錯誤了。例如:# include<># include""# import<># import""的導(dǎo)入方式是否有錯誤。


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只能在iOS 4.2或更高版本上使用,所以你可以更改工程Deployment Info —> Depoyment Target


如果你的IDE報了如下錯誤

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" 說我沒有權(quán)限。

可以在Build settings->Product Name項修改.Product Name項默認(rèn)是$(TARGET_NAME),可以修改任意app名稱。


如果遇到上面的情況,還有一種方式解決:

Project —> Build Setting —> Build Options —> Compiler for C/C++/Objective-C中 修改這一項,變成Default Compiler(Apple LLVM 6.0)

這種方法可以解決很多因為編譯器引發(fā)的問題。


有的時候會遇到這樣類型的錯誤

property type ‘id <maintabbardelegate>’ is incompatible with type ‘id <uitabbardelegate>’ inherited from ‘uitabbar’
UIKit 代理
自己定義的代理

這是因為自己的代理屬性名和繼承的父類代理屬性名重名了,這種情況只需要把自己代理屬性名更改就可以。

但是這種方法還不是很好的解決方式,最好的解決方式是在定義代理的時候,繼承自父類的代理。這樣做的好處是,符合Objective-C中的繼承的特性;而且外界使用當(dāng)前類的代理的時候,可以通過遵守當(dāng)前類的代理,達(dá)到將父類的代理也遵守,更加方便外界使用。而且蘋果官方也是這樣做的。


storyboard中,由Controller A跳轉(zhuǎn)到Controller B的時候然后報錯

Warning: Attempt to present *** on *** whose view is not in the window hierarchy!

大致分析一下,應(yīng)該是這么回事情,在Controller aviewDidLoad里面直接跳轉(zhuǎn)Controller b,然后導(dǎo)致在顯示Controller b的時候也調(diào)用了Controller a來顯示,然后發(fā)現(xiàn)這個window的層次結(jié)構(gòu)就錯亂了。

Controller a中跳轉(zhuǎn)的時候,要在viewDidLoad以及viewDidAppear之后才能跳轉(zhuǎn),所以可以自己想辦法延時跳轉(zhuǎn),而不是直接跳轉(zhuǎn)。也可以將這個方法寫在其他位置,根據(jù)自身情況而定。


The document "ViewController.xib" could not be opened. Unrecognized file content.

很多情況都會造成這個錯誤,最常見的是因為svn或者git等版本控制工具進(jìn)行代碼update的時候造成的。我們解決完沖突之后將Xcode退出,刪除緩存,然后在右邊的列表里找到Open AS -> Interface Builder XIB Documents就可以了。

這個問題應(yīng)該算是Xcode的一個bug,跟我們并沒有關(guān)系。


import <framework/framework.h> file not found

我們導(dǎo)入一個新的framework之后報file not found錯誤,或者當(dāng)前framework導(dǎo)致其他frameworkfile not found錯誤,這都是因為路徑導(dǎo)致的錯誤,我們需要指定一下程序的路徑。

解決方法

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編譯最低版本設(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)有一個和當(dāng)前運行程序相同identifier程序,需要將設(shè)備上相同identifier的程序刪除,或者修改當(dāng)前運行程序的identifier,然后在重新運行即可。

Identifier

ProjectName does not have an architecture that DeviceName can execute.

這個問題主要是因為項目設(shè)置的ARM指令集,比設(shè)備指令集高,也就是項目沒有兼容低版本設(shè)備的指令集導(dǎo)致的。所以需要我們設(shè)置更低的指令集來兼容低版本設(shè)備,這個設(shè)備版本不是iOS系統(tǒng)版本,而是硬件的版本,例如iPhone5iPhone6這樣的設(shè)備。

ARM指令集

如果重新設(shè)置了設(shè)備指令集,還是不能正常運行程序,并且出現(xiàn)下面的錯誤。

failed to send the handshake ack

如果從錯誤信息上來看,是一個握手符號發(fā)送失敗,但是并不是這樣的,也不是因為網(wǎng)的問題。這主要是因為我們出現(xiàn)上面ARM指令集錯誤之后導(dǎo)致的,需要我們手動還原系統(tǒng)設(shè)置。

具體操作

通用 -> 還原 -> 還原所有設(shè)置 (這個操作越獄機(jī)慎重)


Variables View (控制臺變量) 不顯示變量的值和內(nèi)存地址,很多對象都顯示為nil,而實際上是有值的。

這主要是因為我們將當(dāng)前工程的Edit SchemeBuild Configuration設(shè)置為了release模式,在release模式下編譯器會模擬真機(jī)運行狀態(tài),會對一些調(diào)試參數(shù)進(jìn)行優(yōu)化,包括不顯示Variables View變量。

所以解決方案就是我們將Build Configurationrelease模式改為debug模式,變量值和內(nèi)存地址就出來了。


Unknown type name ‘ViewController’;did you mean ‘UIViewController’?

或者是下面的問題

Unknown type name ‘ViewController’;

這是因為在代碼中的兩個類,使用#import直接或間接的循環(huán)引用導(dǎo)致的,這個錯誤是發(fā)生在編譯期的。例如classA#importclassBclassB#importclassA,或中間隔了幾層的循環(huán)引用。

解決方式是找到循環(huán)引用的類,然后在產(chǎn)生循環(huán)引用的任意一個類的.h文件中使用@class的方式引用,然后在類的.m中使用#import引用就可以解決。


Could not find Developer Disk Image
問題所在

這種情況一般都是出現(xiàn)在真機(jī)調(diào)試的過程中,是因為測試設(shè)備系統(tǒng)版本比Xcode的可運行版本高,所以導(dǎo)致Xcode找不到對應(yīng)的磁盤映射文件。

解決方法1

對于這樣的問題,我們可以通過升級Xcode來解決,只要把Xcode升級到最高版本這個問題就解決了。因為最新的Xcode可運行版本始終都是比最新的iOS系統(tǒng)高或持平,所以這種方法可以解決,而且這也是蘋果希望的。

但是升級Xcode的過程中會導(dǎo)致不能打開Xcode,嚴(yán)重影響我們的工作,而且Xcode體積比較大,升級過程對網(wǎng)速的要求比較高。而且下載一個Xcode之后也不一定立刻能用,有時候Xcode升級了,但是Mac操作系統(tǒng)版本不能支持Xcode,還要升級Mac操作系統(tǒng),又是一天過去了。。。

解決方法2 (個人推薦)

對于這個問題,我們可以考慮添加iOS系統(tǒng)對應(yīng)的 DeveloperDiskImage文件解決,這也就是上面我們說的Xcode磁盤映射文件,下載并添加這個文件就可以了。

具體文件可以直接Google下載一個,下載之后直接放在下面的目錄即可。例如我現(xiàn)在要運行iOS9.3.1的系統(tǒng),我就下載一個文件名為9.3 (13E230)的文件,然后放在這個目錄,就可以正常運行真機(jī)了。

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/

一個DeveloperDiskImage文件可以運行當(dāng)前中等版本號的所有子版本號,例如這次更新的9.3.1系統(tǒng)的DeveloperDiskImage文件,就可以運行9.3.09.3.9的所有9.3開頭的子版本號,對于其他系統(tǒng)版本同理。

Xcode升級策略

對于Xcode的升級,我自己的想法是只有在6.xx7.xx這樣的大版本更新,我才會升級Xcode,其他小版本我都不會去升級。為了保證真機(jī)運行,每次更新iOS系統(tǒng)后,我都會采用上面的方式來升級Xcode磁盤映射文件,但Xcode我不會去升級。

這主要還是因為Xcode體積比較大,升級一次確實不容易,而且頻繁升級Xcode也沒有什么大的變化。一般在6.xx7.xx這樣的大版本更新,Xcode才會有比較大的變化,這時候我才會選擇升級Xcode


iPhone6 is busy: Processing symbol files
Xcode will continue when iPhone6 is finished
Processing symbol files

真機(jī)運行時,經(jīng)常會出現(xiàn)上面的錯誤,但是項目的配置、證書、設(shè)備什么的都沒問題啊。

其實從Xcode上面的進(jìn)度信息也可以看到,Xcode正在處理符號文件。Xcode每次連接新設(shè)備后,都會進(jìn)行這步操作,只有第一次連接會這樣,之后就不會了。所以我們要做的就是,等。。。


Charles無法抓包

Mac上下載Charles后,直接就可以抓包,而手機(jī)上配置代理后也可以抓包。
但是有的時候Charles會出現(xiàn)無法抓包的情況,重新卸載后再安裝,還是無法抓包。
遇到這樣的情況,可以按照下面的步驟,檢查一下是否是配置的問題。

  1. 查看Charles下面兩個選項是否勾選,如果勾選將其取消。
    Proxy -> Proxy Settings -> Enable transparent HTTP proxying
    Proxy -> SSL Proxying Settings -> ->SSL Proxying -> Enable SSL Proxying

  2. 查看Charles下面選項是否勾選
    Proxy -> Mac OS X Proxy

  3. 關(guān)閉科學(xué)上網(wǎng)工具。


ld: library not found for -lBeeHive
clang: error: linker command failed with exit code 1 (use -v to see invocation)
解決方案

這種問題一般都是缺少庫文件所導(dǎo)致的,例如使用某個第三方庫,但沒有導(dǎo)入其文件,就會報這樣的錯。所以需要根據(jù)提示信息,找到缺失的庫文件,并將其拖入工程中即可。

如果使用了CocoaPods,那就是沒有更新podfile文件所導(dǎo)致的,執(zhí)行pod命令并重新打開工程即可。


[!] The master repo requires CocoaPods 1.0.0 -(currently using 0.39.0)
Update CocoaPods, or checkout the appropriate tag in the repo.

升級Xcode 8Mac10.12之后,在pod update的時候發(fā)現(xiàn)報這個錯誤。

按照錯誤提示來說是升級CocoaPods,嘗試之后升級失敗。后來以為是gem的問題,打印了一下gem的地址,也沒什么問題。

趕快Google查了一下是什么問題。后來查到在Mac10.11之后,系統(tǒng)會把CocoaPods移到/usr/local/bin路徑下。所以又重新安裝了一遍CocoaPods,并指定了路徑,就可以了。

sudo gem install -n /usr/local/bin cocoapods

之前一般都是通過不指定路徑的方式安裝的,所以會安裝到CocoaPods默認(rèn)路徑下。

sudo gem install cocoapods

如果重新安裝CocoaPods之后,還是報下面的錯誤,那就需要改一下Podfile文件。

[!] The dependency `ReactiveCocoa (= 2.0)` is not used in any concrete target.

Podfile文件添加上target,再運行pod update就沒問題了。

target “Project” do
pod 'ReactiveCocoa' , '2.0'
end

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,117評論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,860評論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,128評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,291評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,025評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,421評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,477評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,642評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,177評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,970評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,157評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,717評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,410評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,821評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,053評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,896評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,157評論 2 375

推薦閱讀更多精彩內(nèi)容