iOS開發總結-Xcode常見錯誤

來源:互聯網
上載者:User

標籤:添加   nts   xxx   自身   rod   包括   http   其他   c/c++   

這篇文章中收錄了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 laterclang: 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 aviewDidLoad裡面直接跳轉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導致其他frameworkfile 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 SchemeBuild Configuration設定為了release模式,在release模式下編譯器會類比真機運行狀態,會對一些調試參數進行最佳化,包括不顯示Variables View變數。

所以解決方案就是我們將Build Configurationrelease模式改為debug模式,變數值和記憶體位址就出來了。

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

Unknown type name ‘ViewController’;

這是因為在代碼中的兩個類,使用#import直接或間接的循環參考導致的,這個錯誤是發生在編譯期的。例如classA#importclassBclassB#importclassA,或中間隔了幾層的循環參考。

解決方式是找到循環參考的類,然後在產生循環參考的任意一個類的.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.09.3.9的所有9.3開頭的子版本號碼,對於其他系統版本同理。

Xcode升級策略:
對於Xcode的升級,我自己的想法是只有在6.xx7.xx這樣的大版本更新,我才會升級Xcode,其他小版本我都不會去升級。為了保證真機運行,每次更新iOS系統後,我都會採用上面的方式來升級Xcode磁碟對應檔,但Xcode我不會去升級。

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

iPhone6 is busy: Processing symbol filesXcode 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 Proxying2. 查看Charles下面選項是否勾選Proxy -> Mac OS X Proxy3. 如果用過Lantern或者其他FQ工具,需要檢查下面選項是否勾選,很多FQ工具會配置下面選項。系統喜好設定 -> 網路 -> 進階 -> 自動代理配置

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

ld: library not found for -lBeeHiveclang: 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 8Mac10.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” dopod ‘ReactiveCocoa‘ , ‘2.0‘end

 

iOS開發總結-Xcode常見錯誤

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.