这篇文章中收录了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
每次链接新设备后,都会进行这步操做,只有第一次链接会这样,以后就不会了。因此咱们要作的就是,等。。。