Quantcast
Channel: CSDN博客移动开发推荐文章
Viewing all articles
Browse latest Browse all 5930

桥接

$
0
0

ARC的配置

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

设置为非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 查看评论

Viewing all articles
Browse latest Browse all 5930

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>