iOS開發總結-Xcode常見錯誤

coldrush 7年前發布 | 11K 次閱讀 Xcode iOS開發 移動開發

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

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

占位圖

"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"" 的導入方式是否有錯誤。

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報了如下錯誤:

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)

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

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

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系統版本,而是硬件的版本,例如iPhone5、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 每次連接新設備后,都會進行這步操作,只有第一次連接會這樣,之后就不會了。所以我們要做的就是,等。。。

Charles無法抓包

Mac 上下載 Charles 后,直接就可以抓包,而手機上配置代理后也可以抓包。

但是有的時候 Charles 會出現無法抓包的情況,重新卸載后再安裝,還是無法抓包。

遇到這樣的情況,可以按照下面的步驟,檢查一下是否是配置的問題。

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. 如果用過Lantern或者其他F墻工具,需要檢查下面選項是否勾選,很多F墻工具會配置下面選項。
系統偏好設置 -> 網絡 -> 高級 -> 自動代理配置

我不能使用 Charles 就是因為第三種情況,我做的就是直接將其取消,測試了一下還可以照常F墻。

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

解決方案

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

如果使用了 CocoaPods ,那就是沒有更新 podfile 文件所導致的,執行 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 8 和 Mac10.12 之后,在 pod update 的時候發現報這個錯誤。

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

http://ruby.taobao.org/
https://ruby.taobao.org/

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

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

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

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

 

來自:http://www.jianshu.com/p/997ae94510c8

 

 本文由用戶 coldrush 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!