2012-02-12 4 views
4

MyClassで入力されたものがMyClassで認識できないメソッドを呼び出すのは、おそらく間違いか間違いを引き起こす可能性があるため、警告ではなくエラーです。なぜARCでは 'セレクタxの既知のメソッドがありません'がハードエラーですか?

ただし、このエラーはARC固有の理由は何ですか? ARCは、ココアのメモリ管理規約に基づいて、保持する/リリースする/自動リリースする必要のあるものを決定します。セレクタの名前が分かっていることがわかっていることが示唆されます。 SEL変数をperformSelector:に渡すことに問題があるのは当然です。セレクタがinit/copy/newメソッドであるかどうかはコンパイル時にはわかりません。しかし、なぜこれをクラスインタフェースで見るか、あるいは何の違いもありませんか?

私はARCの仕組みについて何か不足していますか、まったく矛盾しているという警告がありますか?

答えて

9

ARCは、ココアのメモリ管理規約に基づいて、保持/解放/自動解除の必要な内容を決定します。セレクタの名前がわかっていることがわかります。

これは、ARCがメモリ管理を決定する単なる1つの方法です。 ARCは、属性を使用してメモリ管理を決定することもできます。たとえば、任意のtypedefを__attribute__((NSObject))を使用して宣言することができます(決してこれまでこれを実行しますが、それは正当です)。 __attribute((ns_returns_retained))などの他の属性を使用して命名規則を上書きすることもできます(名前を修正できない場合は合理的に行うことがありますが、命名を修正する方がはるかに良い方法です)。

ここで、これらの属性を宣言するヘッダーファイルをいくつかのファイルに含めることができなかった場合を考えてみましょう。さて、いくつかのコンパイルユニット(.mファイル)メモリはそれを一方向に管理し、いくつかのメモリは別のものを管理します。 Hijinksは確実です。これはARCのない状況よりはるかに悪く、ARCコードの中にはいくつかのことがあり、他のARCコードは何か異なることがあるため、結果として生じるバグは気になるものです。

だから、そうしないでください。 (もちろん、Objective-Cの警告は無視しないでください。特に厄介な状況です)。

+0

命名規則を無効にする方法については、どうすればいいですか?;) –

+0

http://clang.llvm.org/docs/AutomaticReferenceCounting.htmlから削除されるとすぐに。 :Dしかし、クリスはこれが一般的に良い解決策ではないということは正しいです。これは、ARCの下での漏れやクラッシュよりも良い解決策です。しかし、正しい解決策は、ObjC命名規則に準拠するように名前を修正することです。 –

1

これは予防のオンスだと思います。ちなみに、大きなシステムではselectors do not need to match and matching is all based on the translationなので、絶対に安全ではないので、あなたがプログラムを書いておらず、型の安全性が導入されていれば、それでもあなたを爆破させる可能性があります。何かが何よりも優れている!

コンパイラは、パラメータと戻り値の型、注釈と出力パラメータを知りたいと考えています。 ObjCにはデフォルト値が返されますが、コンパイラがより多くのバグを処理するため、複数の種類のバグの良いソースです。

タイプセーフティを導入し、警告レベルを上げる理由はいくつかあります。 ARCには、さらに多くのものがあります。本当に必要かどうかにかかわらず、objcコンパイラが(IMHO)に向かうのは良い方向です。あなたはObjC 2.0よりも安全なC99をこの点で考えるかもしれません;)

本当にcodegenの制限があるなら、私はそれを聞きたいと思います。

+0

確かに。しかし、この場合ARCについて特別なのは何ですか?一般的に型の安全性を向上させるつもりだった場合は、なぜこれをARCの下でエラーにし、エラーメッセージに 'ARC'プレフィックスを追加するのですか? –

+0

@Chris ahですが、 'performSelector:' *はランタイムの助けを借りて実装できました。エラーである必要はありませんでした。同じことがここにあります。宣言されていないセレクタのパラメータ型の規則が定義されています。 – justin

関連する問題