【问题标题】:__unsafe_unretained and release with ARC__unsafe_unretained 并使用 ARC 释放
【发布时间】:2023-03-20 05:50:01
【问题描述】:

必须使用一个包含类指针的联合,但要启用 ARC,这里也有很好的解释:__unsafe_unretained NSString struct var 你必须设置字段__unsafe_unretained

也就是说,如果我理解得很好,你必须自己管理它的生命周期。

例如:

typedef union FOO {
    char                                    __char;
    __unsafe_unretained NSMutableArray *    __array;
    __unsafe_unretained BarClass *          __bar;
}

如果我这样做:

FOO * foo = malloc(sizeof(FOO));
foo.__bar = [[BarClass alloc] init];
... // I have fun with foo.__bar
[foo.__bar release] // this was before ARC and does not work anymore
free(foo);

如何释放foo.__bar?因为有了 ARC 我不能再打电话给releaseautorelease

【问题讨论】:

    标签: objective-c memory-management automatic-ref-counting


    【解决方案1】:

    最简单的方法是使用__bridge 演员表和CFRelease

    CFRelease((__bridge void *)foo->__bar);
    

    其他一些注意事项:

    1. 请勿使用名称 __char__array__bar。 C 标准保留所有以两个连续下划线开头的标识符。

    2. 您还需要在创建它的语句结束之前保留该对象,因为在该语句结束时,ARC 将释放它。最简单的方法是滥用CFBridgingRetain

      foo->__bar = (__bridge id)CFBridgingRetain([[NSObject alloc] init]);
      
    3. 最好将FOO 转换为一个Objective-C 类,这样它就可以拥有强引用。

    【讨论】:

    • 技术上是正确的,但对我的口味来说有点骇人听闻......正如我在回答中所说的那样,我只是添加一个。指向它的强指针并完成它:D
    【解决方案2】:

    我会持有一个额外的强指针,然后你就不用担心释放它了。

    BarClass *myStrongBar = [[BarClass alloc] init];
    
    FOO * foo = malloc(sizeof(FOO));
    foo.__bar = myStrongBar;
    ... // I have fun with foo.__bar
    free(foo);
    

    【讨论】:

    • 如果他创建了很多这些,并且它们的寿命超过了创建它们的功能,他应该把那个强指针放在哪里?
    • 谢谢,但不幸的是,我无法做到这一点,因为我在生成的代码中使用它。但是感谢您的想法。
    • @robmayoff 同意...那会很糟糕 ^^
    猜你喜欢
    • 2012-01-25
    • 2013-02-08
    • 2012-05-04
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多