1》.在非ARC情况下:如果想将Core Foundation转换为Foundation , 直接强制类型转换即可
2》. ARC 环境下的转换:
oc 转换到c __bridge CFStringRef/ __bridge_retained <==>CFBridgingRetain()
c对象到oc对象的转换 __bridge octype(NSString) * /__bridge_transfer <==> CFBridgingRelease
// Foundation 和 Core Foundation 相互转换. 桥接
// 以后在使用C语言的函数时, 只要函数名称包含creat/copy/retain 就必须自己手动释放CFRelease
// MRC 非ARC
// 在非ARC情况下, 如果想将Foundation转换为Core Foundation , 直接强制类型转换即可
/*
NSString *strOC = [NSString stringWithFormat:@"往年附加快递费"];
CFStringRef strC = (CFStringRef)strOC;
NSLog(@"%@ %@", strOC, strC);
*/
// 1.在非ARC情况下, 如果想将Core Foundation转换为Foundation , 直接强制类型转换即可
/*
CFStringRef strC = CFStringCreateWithCString(CFAllocatorGetDefault(), "12345678", kCFStringEncodingASCII);
NSString *strOC = ( NSString *)strC;
NSLog(@"%@ %@", strOC, strC);
*/
//2. ARC 环境下的转换
// __bridge CFStringRef/ __bridge_retained <==>CFBridgingRetain() oc 转换到c
// __bridge octype(NSString) * /__bridge_transfer <==> CFBridgingRelease c对象到oc对象的转换
/*
NSString *strOC = [NSString stringWithFormat:@"abcdefg"];
// 如果使用__bridge桥接, 它仅仅是将strOC的地址给了strC, 并没有转移对象的所有权
// 也就是说, 如果使用__bridge桥接, 那么如果strOC释放了,strC也不能用了
// 注意: 在ARC条件下, 如果是使用__bridge桥接, 那么strC可以不用释放, 应为ARC会自动管理strOC的内容
CFStringRef strC = (__bridge CFStringRef)strOC;
NSLog(@"%@ %@", strOC, strC);
*/
/*
NSString *strOC = [NSString stringWithFormat:@"abcdefg"];
// 如果使用__bridge_retained桥接, 它会将对象的所有权转移给strC, 也就是说, 即便strOC被释放了, strC也可以使用
// 注意: 在ARC条件下,如果是使用__bridge_retained桥接, 那么strC必须自己手动释放, 因为桥接的时候已经将对象的所有权转移给了strC, 而C语言的东西不是不归ARC管理的
// CFStringRef strC = (__bridge_retained CFStringRef)strOC;
CFStringRef strC = CFBridgingRetain(strOC);// 这一句, 就等同于上一句
CFRelease(strC);
*/
/*
CFStringRef strC = CFStringCreateWithCString(CFAllocatorGetDefault(), "12345678", kCFStringEncodingASCII);
// 如果使用__bridge桥接, 它仅仅是将strC的地址给了strOC, 并没有转移对象的所有权
// 也就是说如果使用__bridge桥接, 那么如果strC释放了,strOC也不能用了
// NSString *strOC = (__bridge NSString *)strC;
*/
/*
CFStringRef strC = CFStringCreateWithCString(CFAllocatorGetDefault(), "12345678", kCFStringEncodingASCII);
// 如果使用__bridge_transfer桥接, 它会将对象的所有权转移给strOC, 也就是说, 即便strC被释放了, strOC也可以使用
// 如果使用__bridge_transfer桥接, 他会自动释放strC, 也就是以后我们不用手动释放strC
// NSString *strOC = (__bridge_transfer NSString *)strC;
NSString *strOC = CFBridgingRelease(strC); // 这一句, 就等同于上一句
*/
如果第三方库是MRC,通常最简便的方案是:将其打包成静态库直接使用。
补充知识点:ARC转非ARC
// 20160404-ARC转非ARC
//
// Created by devzkn on 4/4/16.
// Copyright © 2016 hisun. All rights reserved.
//
/** ARC 是编译器特性,而不是IOS运行时特性,它也不类似于其他语言的垃圾收集器(GC)
1)ARC的规则:只要还有一个变量指向对象,对象就会保持在内存中-- 默认所有的实例变量和局部变量都是strong指针,因为它们能保持对象的生命。
2)OC中有强参照strong和弱参照weak。--weak型的指针变量仍然可以指向一个对象,但不属于这个对象的拥有者;weak指针主要用于父子关系,即父亲拥有一个儿子的strong指针,儿子需使用weak指针指向父亲。
典型的例子:
你的ViewControl通过strong指针(self.view)拥有一个UITableView,UITableView的dataSource和delegate都是weak指针,指向你的viewControl
@property(null_resettable, nonatomic,strong) UIView *view;
@property (nonatomic, weak, nullable) id <UITableViewDelegate> delegate;
3)在ARC(代码的一种静态分析工具)中dealloc 主要用于调试,判断对象被释放。可以用来管理一些资源,
*** an implementation of dealloc, do not invoke the superclass’s implementation 不能调用[super dealloc]
*** 在ARC下父类的dealloc同样由编译器自动完成,不能用来释放实例变量;
4)在ARC中考虑的是对象之间的关联,也就是那个对象拥有哪个对象。--无论何时你创建一个对象时,都要考虑谁该拥有它,以及这个对象需要存活多久
5)ARC只能工作于OC。
如果应用了core foundation,malloc()、free(),此时还是需要你来手动管理
*/
非ARC-》ARC的转化过程:
1.去掉dealloc 方法
dealloc
- (void)dealloc{
NSLog(@"%s",__func__);
[super dealloc];
self.window = nil;
}
2、retain 修改为strong
作者:u011018979 发表于2017/7/4 15:51:59 原文链接
阅读:61 评论:0 查看评论