Object-C之Bug集中营

来源:互联网 发布:知乎图片大小 编辑:程序博客网 时间:2024/05/29 14:11

1. iOS This iPhone 6s等 is running iOS 10.1 (14B72), which may not be supported by this version of Xcode

升级包放在路径:应用程序(xcode)-右键-显示包内容 /Developer/Platforms/iPhoneOS.platform/DeviceSupport。

2. “iphone名称” is busy: Processing symbol files Xcode will continue when “iPhone名称” is finished.

拔掉电源,重新插 或者 重启iPhone


1. lipo -info xxx.a

lipo -info xxx.a //后面是库的地址 去查看静态库的 支持架构

2. * Terminating app due to uncaught exception ‘NSInvalidArgumentException’, reason: ‘-[CPTMutableNumericData setDataType:]: unrecognized selector sent to instance 0x1edcee60’*

在使用静态链接库时,如果出现一些莫名其妙的链接问题,如下提示:
* Terminating app due to uncaught exception ‘NSInvalidArgumentException’, reason: ‘-[CPTMutableNumericData setDataType:]: unrecognized selector sent to instance 0x1edcee60’*
而静态库的一个优点是:链接器可以从静态库中只取出需要的部分来做链接。故没有链接 这些没有调用过方法的 class;
暂时用上面的解决方案解决了,不知道有没有更好的方法来解决这个问题;
以下两种情况都可以设置project的Info里面的Link Flag处,增加-all_load,解决

3. objc_msgSend(self.beginRefreshingTaget, self.beginRefreshingAction, self);Too many arguments to function call, expected 0, have 3

选中项目 - Project - Build Settings - ENABLE_STRICT_OBJC_MSGSEND 将其设置为 NO 即可

4. Warning: Multiple build commands for output /…/…

出现这种 Warning 的原因,由于将原来资源文件包删除,重新加入后,导致编译器在编译时,又一次引入了该资源!也就是说,编译的外部资源引入重复!

5. ld: duplicate symbol OBJC_CLASS$_************ in ******

可能性是你的项目的不同group里有着相同名称的类

6. You could also get this error if you mistakenly let XCode’s auto-complete for #import statements specify the ‘.m” file for the ‘duplicate’ class instead of the ‘.h’.

xcode的自动完成特性,在你导入头文件的时候,将”.h”补成了”.m”

7. ld: duplicate symbols for architeture x86_64 clang:error:linker command failed with exit code 1 (use -v to see invocation)

可能: 是工程下的文件夹有两个类名一样的类,因为在不同的文件夹,所有可以共存,仔细查看上面bug提示可以定位到具体哪个类
或者第三库没有被引用,解决办法Target–>Build Phases–>compile Sources中对应着看是否缺少哪个引用

8. 遇到”libc++abi.dylib: terminate_handler unexpectedly threw an exception”错误,app莫名其妙就crash掉了

控制台输入bt命令,查看调用堆栈,分析现在唯一的信息点是libc++abi.dylib,这个库到底是做什么的?从后缀看,是一个动态库,那么会不会是因为发生了一些动态错误?而按经验来看,一般的动态错误基本是因为动态类型错误引起,在object-C语言中,会发生动态类型错误的可能基本存在于不可变类型与可变类型之间的转换,那么我们的查错范围将优先限制在不可变类型与可变类型转换上,是否我们对一个不可变类型进行了修改操作?当然,编译器没有那么傻,如果直接对一个不可变类型进行修改操作,是会直接报错的,那么就剩下另一种可能,程序将一个不可变类型赋值给可变类型,然后对可变类型进行了修改操作,这样可以通过静态检查,但是动态运行的时候,就会发生类型错误。基于以上分析,我们可以跟踪断点,会发现程序在对mutable对象进行add、set等操作时挂掉,而这个对象实际上赋值的是一个不可变对象。常见的情况是把一个NSArray对象赋值给一个NSMutableArray对象,然后进行了delete、add等修改操作,或者把一个NSDictionary对象赋值给一个NSMutableDictionary对象,然后进行了set等操作。


0 0
原创粉丝点击