汇总一些在平时开发中遇到的BUG,不定期更新
用AutoLayout有时候会出现:
Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x17ef4e10 V:[UIView:0x17ee9e00]-(0)-| (Names: '|':UIView:0x17ef3e10 )>",
"<NSLayoutConstraint:0x17ef4e70 V:|-(0)-[UIView:0x17ee9e00] (Names: '|':UIView:0x17ef3e10 )>",
"<NSLayoutConstraint:0x17dc8650 'UIView-Encapsulated-Layout-Height' V:[UIView:0x17ef3e10(455)]>",
"<NSAutoresizingMaskLayoutConstraint:0x17dc86b0 h=-&- v=-&- 'UIView-Encapsulated-Layout-Top' V:|-(0)-[UIView:0x17ef3e10] (Names: '|':UIViewControllerWrapperView:0x17d7ac80 )>",
"<NSAutoresizingMaskLayoutConstraint:0x17d90d50 h=--& v=--& UIView:0x17ee9e00.midY == + 184>"
)
错误原因可能是:在添加约束的时候,比如说 水平方向的约束leading trailing和 weight 冲突了系统会帮我们去掉宽度的限制
解决方法: 重新添加约束,选择性的不添加宽度<根据情况不添加一些约束>
JSON解析数据 for循环嵌套错误:
-[__NSCFString countByEnumeratingWithState:objects:count:]: unrecognized selector sent to instance 0x7fff32fabdc0
JSON解析数据,方式不对:
-[__NSCFString objectForKeyedSubscript:]: unrecognized selector sent to instance 0x7f85d4110700
原因: 解析字典时,定义的是数组;解析数组时,定义的是字典
setValue:ForUnderfinedKey:]:this class is not key value coding
原因:连线出问题了
-[ViewController up]: unrecognized selector sent to instance 0x8c50af0
原因:某个对象没有实现某个方法
"_SCNetworkReachabilityCreateWithName", referenced from:
原因:静态库中依赖的一些框架没有导入.如果静态库中用到了框架就必须导入
"std::terminate()", referenced from:
但凡看到错误提示中提示两个冒号,表示C++代码, 默认情况下Xcode创建的工程是不支持C++.
如何解决: 将工程中任意一个文件的后缀改为.MM即可
.c --> C代码
.cpp --> C++代码
.m --> C代码 + OC代码
.MM -->C代码 + OC代码 + C++代码
Undefined symbols for architecture x86_64:
这个错误, 一般是指用到的三方框架不支持64位手机
解决方式: 打开工程 --> Build Settings --> All --> Architectures --> Debug\Release --> Other -->修改为 $(ARCHS_STANDARD_32_BIT)
真机测试
/Users//SDKs/PolymerPay/Library/mobStat/libSDK.a(**ForSDK.o)’does not contain bitcode. You must rebuild it with bitcode enabled (Xcodesetting ENABLE_BITCODE), obtain an updated library from the vendor, or disablebitcode for this target. for architecture arm64
/...linker command failed with exit code 1 (use -v to see invocation)
看警告可以得到的信息是"引入的一个第三方库不包含bitcode"。至于什么是bitcode,我是不太明白是神马意思,通过查阅相关资料,得出的结论是:这个东西应该和包的优化有关。
在上面的错误提示中,提到了如何处理我们遇到的问题:
You must rebuild it with bitcode enabled(Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, ordisable bitcode for this target. for architecture arm64
意思就是说:要不你第三方类库支持 bitcode 要不你就关掉它
好吧,我们只能选择后者了
我们来看看他在那里?
某些另类的Bitcode报错
在进行了上述操作之后,某些第三方库或者静态库出现了一下报错信息:
std::__1::basic_istream<char, std::__1::char_traits<char> >::~base_istream()
如图:
错误原因:该库是c++和oc混编
解决方案:在项目配置中-->Linked Frameworks and Libraries 添加库 libstdc++.tbd
编译时报错
_OBJC_CLASS_$_xxx第三方库", referenced from: objc-class-ref in xxxViewController.o
报错原因:
该第三方库不支持模拟器调试,只能真机测试
白名单
在进行APP之间的跳转问题上,有时候代码完全没有问题,却死活不进行跳转。
原因是从xcode7开始(iOS9开始),程序里面所有的其他网络连接都得添加在白名单里面,不然是无法响应的!
解决方案:
在plist文件中里面添加一个key为“LSApplicationQueriesSchemes”数组值,里面添加包括string型的“scheme”,其他的可根据需求依次添加。
如:需要qq登录、分享
添加:mqqapi、mqq、mqqopensdkapiV2、mqqOpensdkSSoLogin、mqzone、mqzoneopensdkapiV2、mqzoneopensdkapi
HTTP & HTTPS
在iOS9,苹果将HTTP换成了HTTPS!真是反程序猿的设计
为此,要么后台大改,全部换成HTTPS,要么就继续延用现有。
延用现有如图设置:在plist文件中里面添加一个key
AFNetworking
无法解析数据,error错误信息如下:
原因:
AFNetworking中的ContentTypes设置只有最最最通用的几个而已(貌似是三个),然而不同的后台程序员的编码格式可能不同,当AFN中没有该同事的格式时,不论如何修改都将无济于事。
解决方案:
像上面14_3图所示,缺少的content-type 是 text/plain,添加上去即可!(小小建议:修改第三方库源码时,尽量注释掉原来的Demo,在下面重写)
模拟器使用CoreLocation定位
不进入定位的代理方法,并且出现错误信息:
Error Domain=kCLErrorDomain Code=0 “(null)”
解决方案:
1、确保所有关于定位的配置信息都已齐全,<a href="http://www.jianshu.com/p/0c0905e261a7">配置信息参考这篇文章</a>。
2、进行下列操作:project-->scheme-->edit scheme-->options-->core location-->allow location simulation配置选中,将Default Location设置一个默认的位置。
3、将simulator-->reset content and settings 重启。
4、运行程序,完成调试。
截图如下:
PUSH通知推送:
The 'Apple Push Notification' feature is only available to users enrolled in xxx
原因:开发者账号不是付费账号,没有推送服务的权限
解决:
1、换一个付费账号。
2、注释掉推送部分,先处理其他需求。
3、如果硬是要使用推送部分代码可以进行以下操作:
1、在projectName.xcodeproj文件上右键“显示包内容”
2、用文本编辑器打开“project.pbxproj”文件(.pbxproj!不要找错了文件!)
3、查找:
com.apple.Push = { enabled = 1; };
修改为:
com.apple.Push = { enabled = 0; };
4、重新编译即可
关于在Xcode 9.0+ 运行后的项目,在Xcode 7 or 8 中运行报错的问题
报错信息:
ld: framework not found FileProvider for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
原因:静态库用Xcode9打包,用Xcode8编译的话就会报错
解决方案:
1、确保你的Mac上有 Xcode 9.0+版本,点击此处下载Xcode。
2、打开Finder-->应用程序-->找到Xcode 9.0+ --> 右键‘显示报内容’
3、进入路径/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/
4、找到报错的 not found 文件(Copy the 'FileProvider.framework'
)
5、应用程序中找到Xcode 7 or 8,再次执行步骤 2、3、进入路径,将报错framework粘贴到 Xcode 7 or 8 路径里面。
6、Xcode 7 or 8 中打开项目,command+shift+K 清除缓存,重新编译即可。(一点要clean,否则会一直报错)
点击查看 Stack Overflow 上的案例