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


85

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

-fno-objc-arcとマークすれば、この制限はないと思いました。

回答:


170

このメッセージが表示された場合は、__ 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;

4
また、文字列を割り当てるときに問題が発生し、保持されたオブジェクトをunsafe_unretained変数オブジェクトに割り当てると、割り当て後に解放されるという警告が表示されます。そして、使用するとクラッシュします
Deepak Singh Negi

8
これですべての問題が解決するわけではありません。通常、オブジェクトはすぐに解放されるため、使用できなくなります。
Diziet 2012

はい-これは実際には機能しません...解決策は、私がまだ理解できていない派生ソースファイルのARCをどうにかしてオフにすることです...
nielsbot 2013年

1
これを行うには、ビルドフェーズでファイルに-fno-objc-arcフラグを追加します。
Abizern 2013年

構造体フィールドが単なる「ダム参照」であり、オブジェクトが実際に別の場所(たとえば、内部)に保持(所有)されている場合はNSArrayどうなりますか?その場合、すぐに割り当てが解除されることはありませんが、コンパイラは何を言うのだろうか(今はテストできません)...
Nicolas Miari

30

むしろ使用するよりも構造体を、あなたが作成することができObjective-Cのクラスを代わりにデータを管理します。


どうやって?サンプルはどこにありますか?

では、なぜ小さなユースケース向けに構造化できないのでしょうか。
Devanshu Saini 2018

13

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

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


しかし、プロジェクトでアークファイルと非アークファイルをどのように使用できるか。たとえば、sharekitを非アークとして使用し、インスタンスを使用して公開できます。私が使用しているファイルはアークファイルです。
zsolt 2011

-fno-objc-arcプロジェクト内でARCファイルと非ARCファイルを混在させるために使用できますが、構造体や共用体などのプレーンなC構造体を使用している場合は、ARCをまったく使用できません。
voidStern 2011

voidSternに感謝します。「しかし、構造体や共用体などのプレーンなC構造体をどこでも使用している場合は、ARCをまったく使用できません。」-これは本当ではないと思います。私は自分のファイルにARCを使用しています。そして、libharuファイルの非アーク。元の問題を回避する方法は、値を個別にCファイルに渡し、そこで構造体を作成することでした。重要なのは、アークから非アーク、アークへのジャンプだと思います。
zsolt 2011年

1
少し誇張されているかもしれません。本質的に、オブジェクトへのポインタを構造体や共用体に置くことはできません。これはARCを混乱させるでしょう。構造体や共用体でプレーンCライブラリを使用することは(通常)可能であるはずです。
voidStern 2011年

6

おそらくこの変更後、これはエラーなしで機能するようになりました。

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

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.