zoukankan      html  css  js  c++  java
  • ARC 类型转换:显式转换 id 和 void *

    http://blog.csdn.net/chinahaerbin/article/details/9471419

    /*

     * 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 转换 //////////////////////

    /*

     * __bridge_retained 转换可使要转换赋值的变量也持有所赋值的对象.

     */

    // __bridge_retained 转换 /////////////

    // ARC 有效时的代码

    id obj = [[NSObject alloc] init];

    void *p = (__bridge_retained void*)obj;

    // ARC 无效时的代码

    id obj = [[NSObject alloc] init];

    void *p = obj;

    [(id)p retain];

    // __bridge_retained ARC 转换

    void *p = 0;

    {

        id obj = [[NSObject alloc] init];

        p = (__bridge_retained void *)obj;

    }

    NSLog(@"class=%@", [(__bridge id)p class]);

    /*

     * 变量作用域结束时,虽然随着持有强引用的变显obj失效,对象随之释放,

     * 但由于 __bridge_retained 转换使变量p看上去处于持有该对象的状态,

     * 因此该对象不会被废弃。下面我们比较一下ARC无效时的代码是怎样的。

     */

    // ARC 无效时的代码

    void *p = 0;

    {

        id obj = [[NSObject alloc] init]; /* [obj retainCount] -> 1 */

        p = [obj retain];     /* [obj retainCount] -> 2 */

        [obj release];      /* [obj retainCount] -> 1 */

    }

    /*

     * [(id)p retainCount] -> 1

     * 即

     * [obj retainCount] -> 1

     * 对象扔存在

     */

    NSLog(@"class=%@", [(__bridge id)p class]);

    // __bridge_retained 转换 /////////////

    /*

     * __bridge_transfer 转换提供与 __bridge_retained 相反的动作,

     * 被转换的变量所持有的对象在该变量被赋值给转换目标变量后随后释放。

     */

    // __bridge_transfer 转换 /////////////

    // ARC 有效时的代码

    id obj = (__bridge_transfer id)p;

    // ARC 无效时的代码

    id obj = (id)p;

    [obj retain];

    [(id)p release];

    // __bridge_transfer 转换 /////////////

    /*

     * 不使用id型或对象型变量也可以生成、持有以及释放对象。

     * 虽然可以这样做,但在ARC中并不推荐这种方法。

     */

    // ARC中并不推荐这种方法 /////////////

    // ARC 有效时的代码

    void *p = (__bridge_retained void *)[[NSObject alloc] init];

    NSLog(@"class=%@", [(__bridge id)p class]);

    (void)(__bridge_transfer id)p;

    // ARC 无效时的代码

    id p = [[NSObject alloc] init];

    NSLog(@"class=%@", [p class]);

    [p release];

    // ARC中并不推荐这种方法 /////////////

  • 相关阅读:
    数据结构——霍夫曼树及题目场景应用
    算法——模式匹配
    深入理解Java虚拟机(十)——线程安全与锁优化
    深入理解Java虚拟机(九)——后端编译与优化
    算法——计算点集中共线最多点的直线
    算法——移掉K位数字使得数值最小
    算法—— n个骰子的点数
    Java并发编程的艺术(十二)——并发容器和框架
    算法——不用加减乘除符号运算加法
    5章-项目范围管理-day4
  • 原文地址:https://www.cnblogs.com/Keys/p/4532646.html
Copyright © 2011-2022 走看看