重复定义
关键字: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循环。
问题描述:OC的容器(数组,字典,集合)是不允许放入nil的,但往往事与愿违,不经意间会把nil丢到容器里。
NSMutableArray*arr = [NSMutableArrayarrayWithObjects: @"111", @"222", @"333", @"444", @"555",nil]; [arr addObject:nil];
解决方案:在上一个时间的动画结束回调里,再去执行下一个动画。
实际开发过程中,坑远远不止这些,所谓前人挖坑,后人来填,把这些常见错误写出来,只是希望掉坑的人姿势好一些,也希望自己别掉坑,欢迎大家在评论里补充
网友评论