zoukankan      html  css  js  c++  java
  • iOS开发总结-Xcode常见错误

    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名称:

    如果遇到上面的情况,还有一种方式解决:

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

    这种方法可以解决很多因为编译器引发的问题。

    有的时候会遇到这样类型的错误:

    propertytype‘id’isincompatiblewithtype‘id’inheritedfrom‘uitabbar’

    UIKit 代理

    自己定义的代理

    这是因为自己的代理属性名和继承的父类代理属性名重名了,这种情况只需要把自己代理属性名更改就可以。

    但 是这种方法还不是很好的解决方式,最好的解决方式是在定义代理的时候,继承自父类的代理。这样做的好处是,符合Objective-C中的继承的特性;而 且外界使用当前类的代理的时候,可以通过遵守当前类的代理,达到将父类的代理也遵守,更加方便外界使用。而且苹果官方也是这样做的。

    在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。

    Deployment Target

    Thisapplication'sapplication-identifier entitlementdoesnotmatchthatoftheinstalledapplication. These values must matchforan upgradetobe allowed.

    设备上已经有一个和当前运行程序相同identifier程序,需要将设备上相同identifier的程序删除,或者修改当前运行程序的Identifier,然后在重新运行即可。

    Identifier

    项目名doesnothave an architecturethat设备名 can execute.

    这个问题主要是因为项目设置的ARM指令集,比设备指令集高,也就是项目没有兼容低版本设备的指令集导致的。所以需要我们设置更低的指令集来兼容低版本设备,这个设备版本不是iOS系统版本,而是硬件的版本,例如iPhone5、iPhone6这样的设备。

    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

    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或者其他翻墙工具,需要检查下面选项是否勾选,很多翻墙工具会配置下面选项。系统偏好设置 -> 网络 -> 高级 -> 自动代理配置

    我不能使用Charles就是因为第三种情况,我做的就是直接将其取消,测试了一下还可以照常翻墙。

    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

  • 相关阅读:
    吸取前人教训,每个程序员都曾犯过的经典错误,你可千万要避免
    程序员帮助妹妹攻破C语言,整理超详细规划,快来看!
    2020年总结:程序员爱用开发工具 Top 100
    程序员为了拿到N+1辞退金,使计让公司辞退自己,网友评论画风突变!
    回顾2020的爷青结:有哪些记忆里的应用正在消逝!
    菜鸟看过来!新的一年,这几点雷区别再踩了
    年龄从不是学习的界限,84岁高龄奶奶自学编程,受苹果公司CEO邀请参加全球开发者大会!
    TIOBE 2月编程语言排行榜出炉:C语言冠军宝座稳定,前十名有什么变化?
    用TensorRT和Numpy编写的Yolov5推理。在【Nvidia Jetson】设备上运行,无需依赖任何pytorch / torchvision
    Example app/api for exposing yolov5 model via flask
  • 原文地址:https://www.cnblogs.com/LiLihongqiang/p/6874494.html
Copyright © 2011-2022 走看看