xcode8升级之后项目遇到了问题
来源:互联网 发布:2017非诚勿扰淘宝店主 编辑:程序博客网 时间:2024/04/25 16:20
xcode8升级之后项目遇到了问题,接手公司以前的项目运行时常常遇到很多第三方报错,以及Xcode更新后很多的库里面的内容被废弃了,导致很多的错误。
报错:
解决的方法:
AQGridViewCell,这个第三方的类主要是用于处理图片的问题,xcode开发工具升级过后,报这样的错误iPhoneSimulator10.0.sdk/usr/include/objc/objc.h:204:16: 'objc_unretainedObject' has been explicitly marked unavailable here,主要是执行的这段代码
NSMutableDictionary * info = (NSMutableDictionary *) objc_unretainedObject(CFDictionaryGetValue(_selectionColorInfo, objc_unretainedPointer(view) ));
导致的报错,objc_unretainedObject点进去发现这是在苹果原生的类库 <objc/runtime.h> objc.h里面的
xcode8是这样(苹果原生的类库)
// Obsolete ARC conversions.
OBJC_EXPORT id objc_retainedObject(objc_objectptr_t obj)
OBJC_UNAVAILABLE("use CFBridgingRelease() or a (__bridge_transfer id) cast instead");
OBJC_EXPORT id objc_unretainedObject(objc_objectptr_t obj)
OBJC_UNAVAILABLE("use a (__bridge id) cast instead");
OBJC_EXPORT objc_objectptr_t objc_unretainedPointer(id obj)
OBJC_UNAVAILABLE("use a __bridge cast instead");
xcode7.3.1的情况(苹果原生的类库)
但是在xcode 7.3.1程序是正常的,并没有任何报错,
xcode7.3.1是这样
#if __has_feature(objc_arc)
# define objc_retainedObject(o) ((__bridge_transfer id)(objc_objectptr_t)(o))
# define objc_unretainedObject(o) ((__bridge id)(objc_objectptr_t)(o))
# define objc_unretainedPointer(o) ((__bridge objc_objectptr_t)(id)(o))
#else
# define objc_retainedObject(o) ((id)(objc_objectptr_t)(o))
# define objc_unretainedObject(o) ((id)(objc_objectptr_t)(o))
# define objc_unretainedPointer(o) ((objc_objectptr_t)(id)(o))
#endif
最后通过谷歌,将代码改成以下之后,完美没有任何问题
NSMutableDictionary * info = (NSMutableDictionary *) (CFDictionaryGetValue( _selectionColorInfo, (__bridge void *)(view) ));可见苹果去掉了宏,
objc_unretainedObject也被废弃,转而使用了(__bridge void *)来代替,通过网络查询得到(__bridge void*)和objc_unretainedPointer,objc_unretainedObject区别
/*
* ARC有效时三种类型转换:
*/
1、__bridge // 转换
2、__bridge_retained // 转换
3、__bridge_transfer // 转换
// __bridge 转换 //////////////////////
// ARC无效时 对应的代码
id obj = [[NSObject alloc] init];
void *p = obj;
id o = p;
[o release];
// 在 ARC 有效时 通过 __bridge转换 id 和 void * 就能够相互转换
id obj = [[NSObject alloc] init];
void *p = (__bridge void *)obj;
id o = (__bridge id)p;
void *p = (__bridge void *)obj;
id o = (__bridge id)p;
/*
* 通过 __bridge 转换, id 和 void * 就能够相互转换。
* 但是转换为 void * 的 __bridge 转换,其安全性与赋值给 __unsafe_unretained 修饰符相近,
* 甚至会更低。如果管理时不注意赋值对象的所有者,就会因悬垂指针而导至程序崩溃。
*/
// __bridge 转换 //////////////////////
资源参考:http://blog.csdn.net/georgehenrywilliam/article/details/52650169
- xcode8升级之后项目遇到了问题
- xcode8.0升级之后公司项目遇到的问题
- Xcode8升级之后遇到的问题
- Xcode8升级之后遇到的一些坑
- Xcode8升级遇到的问题
- Xcode8之后使用cocoapods遇到的问题
- 升级到Xcode8遇到的问题
- Xcode7升级到Xcode8之后遇到文件冲突
- Xcode7升级到Xcode8之后遇到文件冲突
- 升级到Xcode8和iOS10之后遇到的坑
- Xcode7升级到Xcode8之后遇到文件冲突
- 升级XCode8之后控制台打印了好多乱七八糟的东西
- Xcode8/iOS10 升级后遇到的问题小结
- 升级iOS10和Xcode8遇到问题以及解决办法
- 升级Xcode8.1 遇到的更新swift3.0的问题
- 【总结】升级Xcode8遇到的问题及解决方案!!!
- 【总结】升级Xcode8遇到的问题及解决方案!!!
- xcode8升级问题
- 【教程】微信公众平台开发模式接入客服系统
- 解决移动端点击事件延迟300ms的问题
- 安卓开发:布局中为控件添加选择器
- java服务端–微信APP支付接口
- Android Studio使用错误集
- xcode8升级之后项目遇到了问题
- Vijos 1172题:反质数
- 爬虫养成记
- 设计模式C++实现(13)——中介者模式
- 如何判断一个网站建设公司的实力
- Ubuntu 14.04 安装 openjdk 8
- 设计模式C++实现(14)——职责链模式
- 零基础学习openstack【完整中级篇】及openstack资源汇总
- 题目1013:开门人和关门人 九度OJ