0

クラスポインタを含むユニオンを使用する必要がありますが、ARCがオンであり、ここで非常によく説明されています。__ unsafe_unretained NSStringstructvarフィールドを設定する必要があります__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

4

2 に答える 2

2

最も簡単な方法は、__bridgeキャストを使用してCFRelease

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

その他の注意事項:

  1. __char、、、__arrayおよびの名前は使用しないでください__bar。2つの連続したアンダースコアで始まるすべての識別子は、C標準によって予約されています。

  2. オブジェクトを作成するステートメントが終了する前に、オブジェクトも保持する必要があります。これは、そのステートメントの終了時に、ARCがオブジェクトを解放するためです。それを行う最も簡単な方法は、悪用することですCFBridgingRetain

    foo->__bar = (__bridge id)CFBridgingRetain([[NSObject alloc] init]);
    
  3. FOO強力な参照を保持できるように、Objective-Cクラスに変換する方がよい場合があります。

于 2012-12-29T23:18:36.700 に答える
-1

私はそれへの追加の強力なポインタを保持します、そしてあなたはそれを解放することについて全く心配する必要はありません。

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

FOO * foo = malloc(sizeof(FOO));
foo.__bar = myStrongBar;
... // I have fun with foo.__bar
free(foo);
于 2012-12-29T23:23:23.720 に答える