iOS Exception

iOS Exception 汇总,记录开发学习中遇到的问题,不定时更新

last update date: 2017.03.14  

 

 

 

其它问题

一、xcode Build 成功,但是不会运行到模拟器 

背景:github 上下载一个开源项目,使用了CocoPods

可以编译成功,说明代码是没有问题的,不能运行到模拟器,应该是没有选择正确的 scheme

解决:选择 “Product” >> “Scheme” >> "Edit Scheme" >>  左边 "Run" >> “Info” 选项卡 >> "Executable" >> "你的项目.app" 

 

二、Build warning: directory not found for option “XXX”  

编译后出现的警告,没有找到对应的XXX ,这里XXX一般是 Framework 或 Library 的路径,

一般在打开下载的项目会出现,比如我是在打开微信SDK Demo 时出现的。

解决:在项目 Target 选择 Build Settings 选项,找到 Search Paths 下的 Library Search Paths 项和Framework Search Paths(可以用搜索功能快速定位),

OK,展开Library Search Paths 的值,可以看到其中就有警告中没有找到的XXX路径,删掉它就行

 

三、Error '!obj' trying to fetch default input device's sample rate

背景:使用MPMoviePlayerViewController 播放视频

环境:Mac mini IOS Simulator 

这个坑爹的问题,是提示你需要给设备插上耳机,准确的说,插上外接的音频输出设备。嗯,插在Mac mini 上,就酱紫。

 

四、Build Error “openssl/asn1.h” file not found

背景:接入支付宝时出现

这个问题说穿了很简单,“openssl" 整个文件夹代码都拷贝到项目中,找不到文件是路径问题

再看下支付宝的集成文档,里面要提到 在 “Header Search Paths” 增加头文件路径:$(SRCROOT)/项目名称,显然就是解决这个问题的,

但是注意,这里支付宝Demo 的 openssl 文件夹是放在项目的根目录的,对应路径就是 $(SRCROOT)/项目名称,

你的openssl 文件夹是放在根目录的么?反正我不是放在这里,所以路径要根据你的实际情况修改下。

解决:在 “Build Setting” 下 "Header Search Paths" 增加 openssl 文件夹路径,比如我的路径是 $(SRCROOT)/项目名称/library/AliPay 

如果有问题,请看下 “

 

其它补充:这里文件找不到,除了路径问题,还有一个就是 #include<> 和 #include “” 的区别

#include<>  编译器会优先在系统库中查找该文件,一般引用系统库的时候用<>;

#include “”   编译器优先从项目文件中查找,一般自己写的文件用 “”

 

五、Build Error : Apple Mach-O Linker Error    

       Build Error : linker command failed with exit code 1 (use -v to see invocation)

网上查了一圈,最有可能的原因有三种,分别如下:

第一种:缺少了 .m 文件的引用,在 “Build Phases" 中的 “Compile Sources" 查看,如果有缺失的.m文件(一般是第三方的文件),添加上去;

第二种:正好和第一种相反,重复引用了相同的文件,请删除相同的引用;

第三种:缺少了 .framework 或 .a 库文件的引用,请确保第三方所需要的库文件已经全部引用,在“Build Phases" 中的 “Link Binary With Libraries" 查看;

除了这三种外,还是其它可能,请参看这里

 

我是在接入支付宝时出现这个问题,还是和 openssl 有关,查询 openssl ,发现是用C语言写的,在IOS中并不能直接使用 openssl 的源码,是需要编译成为 .a 库文件进行使用的!再回头看下支付宝的demo,里面确实引用了 openssl 编译出来的两个库文件,libssl.a 和 libcrypto.a。

OK,在项目中加入两个库文件,编译通过,知道真相后我的眼泪都要掉下来...  

很奇怪为什么要同时引用 openssl 源码和编译后的库文件,缺哪个都有问题?

 

六、Thread 1:EXC_BAD_ACCESS(code=EXC_I386_GPFLT)

访问了一块不属于你的内存

解决:找到引起错误的变量,尝试修改为其它变量属性,呃,这块知识点有待加强

 

七、Build Error : apple LLVM 6.1 Error

背景:编译运行外来项目时出现,应该和项目之前的关联路径发生变化有关

解决:有一个简单粗暴的方法,直接删除 Targets 下面的 xxxTests,嗯,右键后选删除。

 

八、iTunes Connect 上传图片,提示“无法载入您的文件。请再试一次”

背景:图片符合要求,出现此问题

解决:确保图片存储路径和图片名称不包含中文字符!

 

九、The iOS 8.2 simulator runtime is not available.

Unable to open liblaunch_sim.dylib.  Try reinstalling Xcode or the simulator runtime.

背景:升级Xcode 7 后出现这个问题

解决:

方法一:参看这里

复制 liblaunch_sim.dylib 到有问题的模拟器版本上

找到下面的文件,复制

/Applications/Xcode-beta.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/lib/system/host/liblaunch_sim.dylib

替换下面的文件

/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS 8.2.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/host/liblaunch_sim.dylib

其它模拟器如果有问题,同理替换,路径都基本一样的

然而,这个方法并没有解决我的问题

 

方法二:

网速好像不错,我重新下载了模拟器版本,这大概是最愚蠢的解决方案 😂

 

十、Undefined symbols for architecture x86_64: "operator delete[](void*)", referenced from:

 

Undefined symbols for architecture x86_64:
  "operator delete[](void*)", referenced from:
      +[WeChatApiUtil EncodeBase64:] in libWeChatSDK.a(WeChatApiUtil.o)
      +[WeChatApiUtil NsDataEncodeBase64:] in libWeChatSDK.a(WeChatApiUtil.o)
      +[WeChatApiUtil DecodeWithBase64:] in libWeChatSDK.a(WeChatApiUtil.o)
      +[WeChatApiUtil DecodeBase64:] in libWeChatSDK.a(WeChatApiUtil.o)
......


背景:导入第三方库(微信)后编译失败。

 

解决:添加 libc++ 库即可。

 

十一、could not launch “XXX” process launch failed security

背景:Xcode 7.1 真机调试,真机版本9.1

原因一:包ID匹配而证书不匹配的问题,请确定使用的是开发证书。

解决:切换为正确的开发证书

 

原因二:9.1下企业应用需要信任开发者描述证书

解决:iphone > 设置 > 通用 > 描述文件 > "你开发用的Apple ID 账号" > 选择信任

解决二:Xcode > Window > Devices > 按住“Ctrl"键点击设备,选"Show Provisioning Profiles" > 删除全部

 

十二、This application's application-identifier entitlement does not match that of the installed application. These values must match for an upgrade to be allowed.

设备上安装了 Bundle identifier 一样的应用,请先删除。

 

十三、交易订单处理失败,请稍后再试 ali64

背景:接入支付宝时出现

原因:密钥问题,商户公钥没有上传到支付宝,或者商户密钥被更换过

RSA密钥分 公钥和私钥,请确保目前项目使用的密钥和上传到支付宝的密钥是配对的。

 

十四、Archive 过程中出现

archive 后 upload 时出现

iOS7 需要添加iPhone5的启动图片支持。Launch Screen File 这个是iOS8后才有的。

 

十五、Could not find Developer Disk Image

真机测试时出现,Xcode没有真机对应的包。比如:Xcode7.1 最高支持iOS9.1

解决:更新你的xcode版本,或者拷贝对应的支持包到下面的路径

 

/Applications(应用程序)/Xcode-beta(右键显示包内容)/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport

 

附录:

iOS Device Support 14.0

iOS Device Support 13.6 

iOS Device Support 10.2 

iOS Device Support 10.1 

iOS Device Support 10.0 

 

 

 

十六、An unknown error message 'DeviceLocked', was received from the device.

接上面 “十五”,如果你导入对应的支持包后,比如10.0的支持包,可能出现这个问题

解决:拔掉数据线,重新插入,简单粗暴。

 

十七、Upload to app store 过程中出现

1. Archive upload  failed with error

版本号不对,设置一个比 1.4.3 更高的版本号,

新修改xcode 中的版本号,要比 iTunes Connect 中心 》应用的构建版本 最新版本高。

 

2. This action could not be completed. Try again. (-22421)

原因:

1. 这个问题一般是Apple iTunes connect 抽风,等一下再试,或者使用 Application Loader 上传。

2. iTunes connect 没有找到应用对应的版本号也会出现。比如要上传的版本是2.0.0 版本,但iTunes connect 还没创建出2.0.0版本。

 

 

 

十八、点击状态栏快速返回头部 失效

这个功能是系统默认有的,失效可能是当前页面由多个UITableView组成,系统不知道响应哪一个。

解决:如果是多列表页面,设置当前使用的UITableView.scrollToTop = YES,其它为NO。

 

十九、Archive failed 

 

.bundle.ltGJwQ/01 for architecture arm64

clang: error: linker command failed with exit code 1 (use -v to see invocation)

一般是第三方库的问题,可能它没有支持gitcode,尝试更换库或者关闭 gitcode 

 

二十、iOS10权限适配

This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSPhotoLibraryUsageDescription key with a string value explaining to the user how the app uses this data.

背景:iOS10后调用相机、相册应用直接挂掉。查了下才知道需要加权限使用说明。

解决:在info.plist 文件中加上对应权限使用说明。

 

<key>NSAppleMusicUsageDescription</key>
<string>App需要您的同意,才能访问媒体资料库</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>App需要您的同意,才能访问蓝牙</string>
<key>NSCalendarsUsageDescription</key>
<string>App需要您的同意,才能访问日历</string>
<key>NSCameraUsageDescription</key>
<string>App需要您的同意,才能访问相机</string>
<key>NSHealthShareUsageDescription</key>
<string>App需要您的同意,才能访问健康分享</string>
<key>NSHealthUpdateUsageDescription</key>
<string>App需要您的同意,才能访问健康更新 </string>
<key>NSLocationAlwaysUsageDescription</key>
<string>App需要您的同意,才能始终访问位置</string>
<key>NSLocationUsageDescription</key>
<string>App需要您的同意,才能访问位置</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>App需要您的同意,才能在使用期间访问位置</string>
<key>NSMicrophoneUsageDescription</key>
<string>App需要您的同意,才能访问麦克风</string>
<key>NSMotionUsageDescription</key>
<string>App需要您的同意,才能访问运动与健身</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>App需要您的同意,才能访问相册</string>
<key>NSRemindersUsageDescription</key>
<string>App需要您的同意,才能访问提醒事项</string>


二十一、Build 安装到模拟器时 Devices NO Such File Or directory

 

描述:删除应用后重新安装,第一次就可以正常使用,第二次编译运行后就会报这个问题。

 

解决:模拟器菜单》hardware 》reboot  即可

 

二十二、Failed to load Info.plist from bundle at path......

解决:clear项目,重新运行

 

二十三、could not attach to pid:

解决:clear 项目,重启模拟器,重新编译,再次运行

 

二十四、pngcrush caught libpng error

解决:

1、确定图片格式没有被修改过,比如jpg图片改后缀名为png,这样是不行滴;

2、确定图片是正常生成出来的,不是切图之类搞出来的;

3、用图片处理工具重新处理图片

 

 

 

 

 

 

异常相关

 

零、设置异常断点捕获 Exception Breakpoint

Xcode 打开 Breakpoint 断点面板,增加一个全局的断点,这样可以定位到大部分的异常抛出位置

 

 

一、lb: library not found for -| XXX

编译的时候出现,原因是编译时找不到需要的库链接

解决:在项目Target 选择要编译的 target ,选择 General 选项,下面有个 “Linked Frameworks and Libraries” , 添加缺失的库链接

 

其它:如果是 lb:library not found for -|Pods.a

说明项目使用 CocoaPods 作为依赖管理工具,负责管理项目中的第三方开源代码,libPods.a 是CocoaPods 将所有第三方编译合成的文件,

当IOS项目使用使用CocoaPods,我们要打开项目工程的是 .xcworkspace 文件,而不是 .xcodeproj 文件,显然这是个菜鸟问题。

 

二、Error Domain=NSURLErrorDomain Code=-1005 "The network commection was lost"

背景:模拟器、使用 AFNetworking 请求数据

切换不同网络连接后会出现

解决:一般重启模拟器可以解决;如果没有解决,可以重置模拟器内容

选 IOS Simulator 》Reset Content and Settings 》Reset

 

三、Error Domain=com.alamofire.error.serialization.response Code=-1016 "Request failed: unacceptable content-type: text/javascript"

背景:模拟器、使用 AFNetworking 请求数据

显然,这是因为请求设置的 content-type 和 服务器返回的 content-type 不相同,服务器用的是 content-type: text/javascript

解决:设置下 

 

afManager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/javascript"];

 

 

四、Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFArray replaceObjectAtIndex:withObject:]: mutating method sent to immutable object'

初始化数据后使用 mutableCopy 方法

 

mArray = [[userDefaults objectForKey:@"test_data"] mutableCopy];

 

五、[NSNull count]: unrecognized selector sent to instance 0x10d76d4c0

这是个坑爹的问题,查了好久才发现原因

服务器接口返回数据中,有空值,有空值,有空值,重要事情说三遍!

比如服务器返回 {"title":""} 

在 oc 中,会转化为 NSNull 值,而不是一个空的 NSString 字符串

这个和 java 转化为空的String字符串是完全不同的

oc 中,NSNull 值不能赋给其它变量,会报错

解决:对可能出现空值的地方进行判断处理,如果可以的话,最好服务器接口不要传空值,改为一个默认值更佳。

 

if ([dict objectForKey:@"title"] == [NSNull null]) {
    NSLog("数据为空");
}

 

update 2015.08.17

没有最坑爹,只有更坑爹!我发现有个接口查不到数据居然仅回传 “[ ]” 这几个字符!!!写接口的你过来,看我不打屎你。

这个用上面的方法是不能检测出来的,因为压根就没东西,考虑到正常的接口JSON都是字典类型,改为下面的方法判断:

 

if ([respObj isKindOfClass:[NSArray class]]) {
    NSLog(@"无数据");
}

 

显然,“[ ]” 转为数组,“{ }” 转为字典。

 

六、Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'attempt to delete row 0 from section 0 which only contains 0 rows before the update'

 

使用 UITableView 时出现,问题出在 section 和 rows 数量与界面中的数量不符,比如:数据中存在 section=2,rows=2,但界面中没有这个分组(行),这时候对该组(行)进行操作就会出现异常。

 

常发生在 insertRowsAtIndexPaths 和 deleteRowsAtIndexPaths 以及 刷新 tableView数据源后。

解决:保持界面与数据源同步

 

七、unknown type name 'CGFloat'

No type or protocol named 'UITableViewDataSource'

导入 #import <UIKit/UIKit.h>

这种类似问题一律导入 kit 

 

八、Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (JSON text did not start with array or object and option to allow fragments not set.) UserInfo=0x7faad1f2b8b0 {NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.}

背景:模拟器、使用 AFNetworking 请求数据

原因:一般是服务器返回的数据格式有问题(不是JSON格式)

解决:

需要确定到底是返回什么样的数据,然后才能正确的解决问题

 

afManager = [AFHTTPRequestOperationManager manager];
// 使用 AFHTTPRequestSerializer/AFHTTPResponseSerizlizer 替换 AFJSONRequestSerializer/AFJSONResponseSerializer
afManager.requestSerializer = [AFHTTPRequestSerializer serializer];
afManager.responseSerializer = [AFHTTPResponseSerializer serializer];
    
[afManager GET:@"you url" parameters:nil success:^(AFHTTPRequestOperation *operation, id respObj) {
    // 将获取到的数据转为字符串输出
    NSData *data = respObj;
    NSString *resultString =  [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"resultString = %@", resultString);
        
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"error: %@", error);
}];

 

 

 

OK,看下输出的结果是什么,再做进一步操作。

比如我打印出来的数据是一个网页的HTML代码,说明接口有问题的,联系后台的同事修改。

(补充:这个接口在网页端返回的是JSON数据;在移动端用IOS源生NSMutableURLRequest 请求也返回JSON数据;用AFNetworking 返回网页;

经查:是后台过滤器问题,默认将移动端请求导到某个页面)

 

如果返回的不是JSON,是字符串数据,可以用上面的方法,转为字符串再进一步处理。

或者尝试使用下面方法

 

afManager.requestSerializer = [AFHTTPRequestSerializer serializer];
AFJSONResponseSerializer *jsonResponseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments];
jsonResponseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
afManager.responseSerializer = jsonResponseSerializer;

 

 

 

参看这里

http://stackoverflow.com/questions/26233611/error-domain-nscocoaerrordomain-code-3840-the-operation-couldn-t-be-completed-u

http://stackoverflow.com/questions/27915879/apns-error-domain-nscocoaerrordomain-code-3840

 

九、use of undeclared identifier KUTTypeImage

解决:

1. 导入库  MobileCoreServices.framework

2. 引用 import <MobileCoreServices/UTCoreTypes.h>

#import <MobileCoreServices/UTCoreTypes.h>

 

 

 

十、unterminated conditional directive

.h 文件中报错的,查了下是因为缺少 #ifdef 或者 #endif 等标识。

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值