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中并不推荐这种方法 /////////////

  • 相关阅读:
    jquery使用
    网站重构?
    WEB应用从服务器主动推送Data到客户端有那些方式?
    异步加载和延迟加载?
    平时如何管理你的项目?
    对前端界面工程师这个职位是怎么样理解的?它的前景会怎么样?
    约定优于配置(convention over configuration)
    JavaEE的13种核心技术
    The Spring Framework ConfigurableListableBeanFactory.java
    mySQL的boolean类型为tinyint(1)
  • 原文地址:https://www.cnblogs.com/Keys/p/4532646.html
Copyright © 2011-2022 走看看