ARCは、ファイル-fno-objc-arcをマークしているにもかかわらず、構造体または共用体のObjective-Cオブジェクトを禁止しますか?これはなぜですか?
-fno-objc-arcとマークすると、この制限はないという仮定がありました。
このメッセージが表示された場合は、__ 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;
むしろstructを使用するよりも、代わりにObjective-Cクラスを作成してデータを管理できます。
これは、arcが構造体または共用体内のオブジェクトを追跡できないためです(それらはその時点でプレーンなCポインターであるため)。
問題のファイル/クラスに-fno-objc-arc
でマークを付けた場合でも、arcで制御されるオブジェクトをパラメーターとして渡すと、メモリリークが発生する可能性が高くなります。
おそらく この変更 の後、エラーなしで動作するように見えます。
つまり、Objective-Cオブジェクトへの通常の(強力な)ポインターをC構造体に入れることができます。 ARCによって管理されます。たとえば、構造体が破壊されると保持されません。検証済み:
$ clang --version Apple LLVM version 10.0.0 (clang-1000.11.45.2)