您的位置:首页 > 移动开发 > IOS开发

xcode8升级之后项目遇到了问题

2017-04-27 13:55 681 查看
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(_selectionColorInfoobjc_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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息