iOS开发总结-Xcode常见错误
"file/file.h"filenotfound
如果遇到这种类型的问题报错,可以分为三部来解决,由简到复杂一步一步来,直到解决问题位置。
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 iOS4.2or laterclang: error: linker command failed withexitcode1(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报了如下错误:
autopropertysynthesis is synthesizingpropertynot explicitly synthesized
解决方法:
project -> build settings -> Apple LLVM 6.0 - Warnings - Objective C -> Implicit Synthesized Properties -> NO.
这样就会消除所有的property警告了。
thefile“XXX” couldnotbe opened because you don't have permissiontoviewit
今天使用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名称:
![](http://upload-images.jianshu.io/upload_images/270478-eb4c573bf7736fd6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/270478-93f208f38728d0cc.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
如果遇到上面的情况,还有一种方式解决:
Project —> Build Setting —> Build Options —> Compiler for C/C++/Objective-C中 修改这一项,变成Default Compiler(Apple LLVM 6.0)
这种方法可以解决很多因为编译器引发的问题。
有的时候会遇到这样类型的错误:
propertytype‘id’isincompatiblewithtype‘id’inheritedfrom‘uitabbar’
![](http://upload-images.jianshu.io/upload_images/270478-e36339ff6f0195df.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
UIKit 代理
![](http://upload-images.jianshu.io/upload_images/270478-4069e7cc365df3d7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
自己定义的代理
这是因为自己的代理属性名和继承的父类代理属性名重名了,这种情况只需要把自己代理属性名更改就可以。
但 是这种方法还不是很好的解决方式,最好的解决方式是在定义代理的时候,继承自父类的代理。这样做的好处是,符合Objective-C中的继承的特性;而 且外界使用当前类的代理的时候,可以通过遵守当前类的代理,达到将父类的代理也遵守,更加方便外界使用。而且苹果官方也是这样做的。
![](http://upload-images.jianshu.io/upload_images/270478-a4bb2837630ec3a5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
在storyboard中,由controller A跳转到controller B的时候然后报错:
Warning: Attempttopresent ***on***whoseviewisnotinthewindow hierarchy!
大致分析一下,应该是这么回事情,在controller a的viewDidLoad里面直接跳转controller b,然后导致在显示controller b的时候也调用了controller a来显示,然后发现这个window的层次结构就错乱了。
在controller a中跳转的时候,要在viewDidLoad以及viewDidAppear之后才能跳转,所以可以自己想办法延时跳转,而不是直接跳转。也可以将这个方法写在其他位置,根据自身情况而定。
The document"ViewController.xib"couldnotbe opened. Unrecognizedfilecontent.
很 多情况都会造成这个错误,最常见的是因为svn或者git等版本控制工具进行代码update的时候造成的。我们解决完冲突之后将Xcode退出,删除缓 存,然后在右边的列表里找到Open AS -> Interface Builder XIB Documents就可以了。
这个问题应该算是Xcode的一个bug,跟我们并没有关系。
import filenotfound
我们导入一个新的framework之后报file not found错误,或者当前framework导致其他framework报file not found错误,这都是因为路径导致的错误,我们需要指定一下程序的路径。
解决方法:在Build Settings -> Framework Search Paths添加路径,$(SRCROOT)/项目名称/文件路径/文件名.framework
storyboardd references cannot bethedestinationsofrelationship segues priortoios9.0
iOS9之后苹果添加了一个新特性-Storyboard References,这个特性如果报以上错误,是因为这个新特性只支持iOS9及以上版本,需要将Xcode编译最低版本设置为iOS9。
![](http://upload-images.jianshu.io/upload_images/270478-e4dfd254e2507881.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
Deployment Target
Thisapplication'sapplication-identifier entitlementdoesnotmatchthatoftheinstalledapplication. These values must matchforan upgradetobe allowed.
设备上已经有一个和当前运行程序相同identifier程序,需要将设备上相同identifier的程序删除,或者修改当前运行程序的Identifier,然后在重新运行即可。
![](http://upload-images.jianshu.io/upload_images/270478-2ca5599949f153bf.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
Identifier
项目名doesnothave an architecturethat设备名 can execute.
这个问题主要是因为项目设置的ARM指令集,比设备指令集高,也就是项目没有兼容低版本设备的指令集导致的。所以需要我们设置更低的指令集来兼容低版本设备,这个设备版本不是iOS系统版本,而是硬件的版本,例如iPhone5、iPhone6这样的设备。
![](http://upload-images.jianshu.io/upload_images/270478-6fcf56ad80b6aa0d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
ARM指令集
如果重新设置了设备指令集,还是不能正常运行程序,并且出现下面的错误:
failedtosendthehandshake ack
如果从错误信息上来看,是一个握手符号发送失败,但是并不是这样的,也不是因为网的问题。这主要是因为我们出现上面ARM指令集错误之后导致的,需要我们手动还原系统设置。
具体操作 : 通用 -> 还原 -> 还原所有设置 (这个操作越狱机慎重)
VariablesView(控制台变量)不显示变量的值和内存地址,很多对象都显示为nil,而实际上是有值的。
这主要是因为我们将当前工程的Edit Scheme的Build Configuration设置为了release模式,在release模式下编译器会模拟真机运行状态,会对一些调试参数进行优化,包括不显示Variables View变量。
所以解决方案就是我们将Build Configuration的release模式改为debug模式,变量值和内存地址就出来了。
Unknown type name ‘ViewController’;did you mean ‘UIViewController’?
或
Unknowntypename‘ViewController’;
这是因为在代码中的两个类,使用#import直接或间接的循环引用导致的,这个错误是发生在编译期的。例如classA中#import了classB,classB中#import了classA,或中间隔了几层的循环引用。
解决方式是找到循环引用的类,然后在产生循环引用的任意一个类的.h文件中使用@class的方式引用,然后在类的.m中使用#import引用就可以解决。
CouldnotfindDeveloper DiskImage
问题所在:
这种情况一般都是出现在真机调试的过程中,是因为测试设备系统版本比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。
iPhone6isbusy: Processing symbol filesXcode willcontinuewheniPhone6isfinished
![](http://upload-images.jianshu.io/upload_images/270478-04025058bc8d7911.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
Processing symbol files
真机运行时,经常会出现上面的错误,但是项目的配置、证书、设备什么的都没问题啊。
其实从Xcode上面的进度信息也可以看到,Xcode正在处理符号文件。Xcode每次连接新设备后,都会进行这步操作,只有第一次连接会这样,之后就不会了。所以我们要做的就是,等。。。
Charles无法抓包
在Mac上下载Charles后,直接就可以抓包,而手机上配置代理后也可以抓包。
但是有的时候Charles会出现无法抓包的情况,重新卸载后再安装,还是无法抓包。
遇到这样的情况,可以按照下面的步骤,检查一下是否是配置的问题。
1. 查看Charles下面两个选项是否勾选,如果勾选将其取消。Proxy->ProxySettings ->Enable transparent HTTP proxying Proxy->SSL ProxyingSettings ->->SSL Proxying->Enable SSL Proxying2. 查看Charles下面选项是否勾选Proxy->Mac OS X Proxy3. 如果用过Lantern或者其他FQ工具,需要检查下面选项是否勾选,很多FQ工具会配置下面选项。系统偏好设置 -> 网络 -> 高级 -> 自动代理配置
我不能使用Charles就是因为第三种情况,我做的就是直接将其取消,测试了一下还可以照常FQ。
ld: library not foundfor-lBeeHiveclang: error: linker command failed withexitcode1(use -v to see invocation)
解决方案
这种问题一般都是缺少库文件所导致的,例如使用某个第三方库,但没有导入其文件,就会报这样的错。所以需要根据提示信息,找到缺失的库文件,并将其拖入工程中即可。
如果使用了CocoaPods,那就是没有更新podfile文件所导致的,执行pod命令并重新打开工程即可。
[!] Themasterreporequires CocoaPods1.0.0-(currently using0.39.0)Update CocoaPods,orcheckout the appropriatetaginthe 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 geminstall-n /usr/local/bincocoapods
之前一般都是通过不指定路径的方式安装的,所以会安装到CocoaPods默认路径下。
sudo geminstallcocoapods
如果重新安装CocoaPods之后,还是报下面的错误,那就需要改一下Podfile文件。
[!] The dependency `ReactiveCocoa (=2.0)`isnotusedinany concrete target.
给Podfile文件添加上target,再运行pod update就没问题了。
target “Project”dopod'ReactiveCocoa','2.0'end