2012-12-29 39 views
0

必須使用聯合包含一個類指針,但與ARC上,並很好地解釋這裏:__unsafe_unretained NSString struct var你必須設置字段__unsafe_unretained__unsafe_unretained和釋放與ARC

這意味着,如果我理解得很好,就必須管理自己的生命週期。

例如:

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了?

回答

2

最簡單的方法是使用一個__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類,以便它可以容納強引用。

+0

謝謝!即使它看起來相當棘手... – Zaphod

+0

技術上正確,但對我的口味稍微ha ... ......正如我在我的回答中所說,我只是持有一個添加。強烈的指針,並做到這一點:D –

+0

@robmayoff是的,這就是我要去嘗試... – Zaphod

-1

我會持有一個額外的強指針,那麼你不必擔心所有關於釋放它。

BarClass *myStrongBar = [[BarClass alloc] init]; 

FOO * foo = malloc(sizeof(FOO)); 
foo.__bar = myStrongBar; 
... // I have fun with foo.__bar 
free(foo); 
+0

如果他創造了很多這些,他應該把那個強大的指針放在哪裏,他們活着他們創造的功能? –

+0

謝謝,但不幸的是,這是我不能做的事情,因爲我在生成的代碼中使用它。但是,感謝這個想法。 – Zaphod

+0

@robmayoff同意......那會很糟糕^^ –