2

このコードは、非 ARC で正常にコンパイルするために使用されます。

int *privateObjMemory = (int *)[myObject performSelector:@selector(privateMethod)];

今私はARCにいます:

ARC では、Objective-C ポインターの「int *」へのキャストは許可されていません

どうすればこれを修正できますか? :)

4

5 に答える 5

3

次のように記述します。

int* privateObjMemory = [myObject privateMethod];

;)

これを避けたい理由は、ARC にとってあいまいだからです。performSelector:オブジェクトを返します --int*保持する必要がありますか? うーん...いいえ。

アップデート

コメントに基づいて、以前の書き込みを削除します。

しかし、それはあまり良い解決策ではありません。特定のプライベート API を呼び出す場合は、その署名 (パラメーターと戻り値の型など) を知っている必要があります。それがプライベート API である場合はそのプライベート インターフェイスを選択的に表示する方法を見つけてください。

それが他の誰かのプライベート API である場合は、正しいパラメーターと戻り値の型を持つ型でカテゴリを宣言します。

次に、セレクターが適切に宣言され、コンパイラーはオブジェクトに直接メッセージを送信することにより、呼び出しを正しくセットアップできるようになります。使用する必要はありませんperformSelector:

于 2012-11-20T10:06:10.800 に答える
2

Obj-C ポインターを にキャストしないでください。ARCint *を使用している場合、これを回避する方法はありません。

このようになっている理由int*は、実行時にポンターを手段に変換すると、ポインターが指しているオブジェクトのメモリを追跡する方法がないためです。そのため、ARC を使用していないときは (自分でメモリを管理できるため) 許可されていましたが、ARC がアクティブなときは許可されていませんでした。

これを行う必要-fno-objc-arcがある場合は、使用されているファイルで ARC を無効にすることができます。プロジェクト設定内の実装ファイルでコンパイラ フラグを使用します。

ここに画像の説明を入力

于 2012-11-20T10:08:12.707 に答える
0

これが実際に ARC に関連しているとは思いません。ARC は単に警告またはエラーを引き起こします。私の知る限り(そして私は血でこれに署名していません)、performSelectorで呼び出されたメソッドの戻り値はnilまたはidです。したがって、それはスカラーではなくオブジェクトでなければなりません。id は (ただし、スカラーではなくオブジェクトへの) 参照であるため、int* でうまく機能する可能性があります。保存側になるには、コードを変更し、代わりに NSNubmer オブジェクトを返す必要があります。

于 2012-11-20T10:02:47.027 に答える
0

idオブジェクトのタイプに使用します。

于 2012-11-20T10:04:52.573 に答える
0

ARCドキュメントでは、彼らは具体的に言っています..

id と void * の間にカジュアルなキャストはありません。

performSelectorを返し、id非目的の C オブジェクト参照でキャストすることはできません。

私がリンクしたドキュメントで、下にスクロールして「フリーダイヤルブリッジの管理」セクションを読んでください。

于 2012-11-20T10:08:21.147 に答える