• ARC 之内存转换


    ARC 之内存转换


    技术博客http://www.cnblogs.com/ChenYilong/ 
    新浪微博http://weibo.com/luohanchenyilong 










     



    ARC 之内存转换 
    技术博客http://www.cnblogs.com/ChenYilong/新浪微博http://weibo.com/luohanchenyilong

     

    Foundation对象&CoreFoundation对象 
    • iOS世界,主要有两种对象: - Objective-C 对象Core Foundation 对象
     Core Foundation对象主要是有C语言实现的Core Foundation Framework 的对象,其中也有对象引用计数的概念,只是不是 Cocoa Framework retain/release,而是自身的CFRetain/ CFRelease 接口



    项目的ARC&MRC之间的转换



    ARC代码 

    id obj = [[NSObject alloc] init];! void *p = obj;!
    obj = p;!
    [obj
     release];!
    !



    ARC代码 

    id obj = [[NSObject alloc] init];!void *p = (__bridge void *)(obj);! obj = (__bridge id)(p);!
    • 使用 __bridge 关键字可以实现id类型与void*类型 的相互转换


    __bridge_retain 

     __bridge_retain关键字表示类型被转换时,其对象
    的所有权也将被变换后变量所持有• MRC代码如下:
    id obj = [[NSObject alloc] init];
    void *p = obj; [(id)p retain]; 


    __bridge_retain测试程序

    void *p = 0;

    {
    Person *obj = [[Person alloc] init];obj.name = @"liufan";
    p = (__bridge void *)obj;

    }
    Person *tmp = (__bridge Person *)p;
    NSLog(@"class=%@ %p %@", [(__bridge Person *)p class], p,tmp.name); 



    __bridge_transfer 
     当想把本来拥有对象所有权的变量,在类型转换 后,让其释放原先所有权的时候,需要使用__bridge_transfer 关键字 
     MRC代码如下 
    id obj = (id)p; [obj retain]; [(id)p release];



    小结 
     __bridge_retained 是编译器替我们做了retain操作 
     __bridge_transfer 是编译器替我们做了release操作 
     __bridge 只是单纯地执行了类型转换,没有进行所有权的转移 
     注意:如果转换的是CFArrayRef,仍然需要手动释放内存 
     辅助解决方法:CMD+SHIFT+B 



    自动释放池 
    • 在程序运行时,当自动释放池被耗尽或者取消分 配时,会向所有调用autorelease的自动释放对象 发送一个release消息



    提示 
    • 将对象添加到数组和集合中时,引用计数会自动 加1,当从数组和集合中删除该对象时,引用计数 会自动减1 

    © chenyilong. Powered by Postach.io


    作者:
    出处:http://www.cnblogs.com/ChenYilong/(点击RSS订阅)
    本文版权归作者和博客园共有,欢迎转载,
    但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    Python2.7-zlib
    Python2.7-sqlite3
    Python2.7-dbm、gdbm、dbhash、bsddb、dumbdb
    Python2.7-anydbm
    Python2.7-marshal
    Python2.7-shelve
    Python2.7-copy_reg
    Python2.7-pickle, cpickle
    Python2.7-shutil
    Python2.7-fnmacth
  • 原文地址:https://www.cnblogs.com/ChenYilong/p/3587711.html
Copyright © 2020-2023  润新知