web-dev-qa-db-ja.com

ARCは、ファイル-fno-objc-arcをマークしているにもかかわらず、構造体または共用体のObjective-Cオブジェクトを禁止します

ARCは、ファイル-fno-objc-arcをマークしているにもかかわらず、構造体または共用体のObjective-Cオブジェクトを禁止しますか?これはなぜですか?

-fno-objc-arcとマークすると、この制限はないという仮定がありました。

85
Zsolt

このメッセージが表示された場合は、__ unsafe_unretainedを試してください。構造体内のオブジェクトが保持されていない場合にのみ安全です。例:ARCでOpenFeintを使用する場合、クラスOFBragDelegateStringsはこのエラーを構造体で示します。

typedef struct OFBragDelegateStrings
{
     NSString* prepopulatedText;
     NSString* originalMessage;
} OFBragDelegateStrings;

typedef struct OFBragDelegateStrings
{
     __unsafe_unretained NSString* prepopulatedText;
     __unsafe_unretained NSString* originalMessage;
} OFBragDelegateStrings;
171
zeiteisen

むしろstructを使用するよりも、代わりにObjective-Cクラスを作成してデータを管理できます。

30
János

これは、arcが構造体または共用体内のオブジェクトを追跡できないためです(それらはその時点でプレーンなCポインターであるため)。

問題のファイル/クラスに-fno-objc-arcでマークを付けた場合でも、arcで制御されるオブジェクトをパラメーターとして渡すと、メモリリークが発生する可能性が高くなります。

13
voidStern

おそらく この変更 の後、エラーなしで動作するように見えます。

つまり、Objective-Cオブジェクトへの通常の(強力な)ポインターをC構造体に入れることができます。 ARCによって管理されます。たとえば、構造体が破壊されると保持されません。検証済み:

$ clang --version Apple LLVM version 10.0.0 (clang-1000.11.45.2)

5