美文网首页
iOS常见错误分析

iOS常见错误分析

作者: iOS_大菜鸟 | 来源:发表于2017-05-24 16:54 被阅读0次

    重复定义

    关键字:duplicate

    问题描述:这个问题就是我们常说的冲突,比如,有一些常见的开源库,AFNetwrok,ASIHttpRequest,大家都用,当大家同时引入这同一个开源库,就很容易出现重复定义的问题。这里举的例子是全局变量和类名冲突,其他的还有各种形式的冲突,不一一列举。

    上图所示,就是两个库,分别在AASIHTTPRequet和TRHTTPRequest都定义了_NetworkRequestErrorDomain,导致重复定义。

    上图所示,自己定义了UIView和UIKit系统库里的UIView冲突了。

    解决方案:既然是冲突,就得有人让步:

    第一种情况,很不巧,这两个库一个封装成.a,一个封装成framework,你如果没办法改动源码,只能联系开发人员修改变量名字了。所以我们自己在封装库的时候,尽量别用那种很通用的类名以及全局变量。

    第二种情况这种类名冲突就好办了,代码可见,而且定位准确,直接修改即可。

    支持库缺失

    关键字:not found

    问题描述:

    这种情况是调用别人封装好的库,但是系统支持库没有导进来的情况。至于缺失什么系统库,需要查文档,或者根据错误信息的名字去搜索。比如上图缺失了一个ASIdentifierManager类,在搜这个类,一般就能查询到是缺了AdSupport库。

    解决方案:

    如上图所示,引入缺失的库即可。

    还有一种情况,如上图所示,缺失的是一个三方库,这个时候就要看三方库是否真的有,如果有这个三方库才能进行引用。

    指令集不支持

    关键字:No architectures to compile

    问题描述:常用的指令集有i386,x86,armv7,armv7s,arm64,不同设备需要对应的指令集支持。

    如上图所示,某些库,只支持armv7和arm64,那就不能在虚拟机上使用。

    还有一种情况是设置问题,Architechures和Valid Architechures两项的交集,才是可以使用的指令集,上图就是两者没有交集,导致的编译失败。

    解决方案:第一种情况,只能找对应库的开发人员提需求,第二种情况,需要根据具体情况,让Architechures和Valid Architechures两项有交集。

    资源格式错误

    关键字:CopyPNGFile

    问题描述:开发中,我们一般用png格式的图片,有时候手里只有jpg格式的图片,就想说改下后缀好了(幼稚),编译的时候就会报找不到xxx.png图片的错误。

    解决方案:老老实实用PS等工具来进行图片格式的转化,别想着改个后缀就来忽悠苹果。

    调用了不存在的方法

    关键字:unrecognized selector

    问题描述:出现unrecognized selector类型的crash,一般是向对象发送了无法处理的消息导致的。说白一点就是这个对象没有你调的那个方法,为什么运行的时候才会出现,这个和OC语言动态绑定的机制有关系。下图所示,是向一个NSNumber的对象发送NSString的方法。

    idnum = [NSNumbernumberWithInt:123];[num UTF8String];


    解决方案:在调用方法之前,检查消息接受者的类型,或者干脆判断一下是否能响应这个消息。常见的方法有,isKindOfClass,respondsToSelector等,总之就是遵循有备无患的原则。

    数组越界

    问题描述:数组越界这个就没啥好说的了,你都跑别人的地盘去了,OC不像C语言那样还能弄点意外惊喜,OC会直接给你crash。

    NSMutableArray*arr = [NSMutableArrayarrayWithObjects:                          @"111",                          @"222",                          @"333",                          @"444",                          @"555",nil];    [arr objectAtIndex:10];

    解决方案:多用数组的count方法,比如循环的时候,可以判断下标和count。

    快速枚举的时候移除元素

    问题描述:快速枚举的时候对容器进行了增减操作等。

    NSMutableArray*arr = [NSMutableArrayarrayWithObjects:@"111",@"222",@"333",@"444",@"555",nil];for(NSString*str in arr) {if([str isEqualToString:@"222"]) {        [arr removeObject:str];    }}

    解决方案:要么就别乱改,如果真需要改,就不要用快速枚举了,用传统的for循环。

    向容器存入nil

    问题描述:OC的容器(数组,字典,集合)是不允许放入nil的,但往往事与愿违,不经意间会把nil丢到容器里。

    NSMutableArray*arr = [NSMutableArrayarrayWithObjects:                          @"111",                          @"222",                          @"333",                          @"444",                          @"555",nil];    [arr addObject:nil];


    解决方案:在上一个时间的动画结束回调里,再去执行下一个动画。

    总结

    实际开发过程中,坑远远不止这些,所谓前人挖坑,后人来填,把这些常见错误写出来,只是希望掉坑的人姿势好一些,也希望自己别掉坑,欢迎大家在评论里补充

    相关文章

      网友评论

          本文标题:iOS常见错误分析

          本文链接:https://www.haomeiwen.com/subject/kmtotxtx.html