答えて
意図的にやりたいことではありませんが、ヌルポインタでインスタンスメソッドを呼び出すことはできます。それが起こると、実行はインスタンスデータにアクセスする必要があり、すべてが強くなるまで非常に楽しく進行します。
この場合、nilをチェックすると手順の先頭に警告が表示され、スタックトレースを記録するなどのさまざまな処理を行うことができます。または、レイズラインにブレークポイントを置くことで、何が起きているのかを知ることができます。
つまり、特定のバグがあった場合は、何もないことがあります。これは、ゼロ参照が使用されていた場所を特定しようとしていました。
定期的にコードの匂いとして私を襲う。
自己がnilであるメモリでコードが実行される可能性のあるアクセス違反のシナリオがあります。一部のプログラマは、実際の問題を解決する代わりに、そのようなアサーションを使用してバイパスしようとすると、種類の破損を防止します。例外が実行時に発生するかどうかを確認します。もしそうなら、あなたの手のひらの下にバグのあるコードがあります。
件名に関する次の記事を読むことができます:When Self in Nil... You Know You are in Trouble
イベントに関連する可能性があります。このようなテストの例が豊富で、ここで詳細を読むことができます。対応する説明はMulticast Events - Part 2です。
nilポインターについて不平を言っている明確なエラーは、それがどう起こったかを示さないアクセス違反よりも優れています。
*可能な*アクセス違反ではなく、無限のポインタをキャッチするための+1。 –
このようにすべてのオブジェクトをコーディングすると言っていますか? –
nilポインタの逆参照がブームにならないようにするのは非常に難しいです。あなたはそこに記憶を持っていません。 –
そして、常にnil Selfで実行したときにコードがクラッシュしない可能性があります。例 - オーナーオブジェクトのフィールドにアクセスしていない場合その場合、このテストは、さもなければ検出されない問題を捕らえるでしょう。
それでも、これは防衛的なプログラミングを極限まで引き締めています。私は決して(OK、ほとんど決してない - 私がウサギを狩っている時だけ...間違っている...バグを潰す)そうする。
私はそれをやったにもかかわらず、クラスメソッドであるかのように非クラスメソッドを使用するのは悪いフォームです。 –
このメソッドの元の意図は、抽象メソッドになるということです。
これは間違いなくクラッシュ(「0x00000000からの読み取り」などのOS例外)につながる機会です。言語例外を投げることは単純に冗長です(EAbstractErrorを誤って使用するとそれが改善されません)。
有効な入力パラメータを確認することは、決して確実ではないため、安全でない言語では実行可能な作業ではないため、無効なパラメータの処理が決して一貫しません。 (なぜ、nilポインタが渡されたときに例外をスローしますか?0x00000001では無効なのはなぜですか?)この質問の技術的な議論については、why not to check for valid pointersのLarry Ostermanのブログを読んでください。
例外として、Delphiではメソッドがnilポインタで呼び出される可能性がありますが、もちろんそのようなチェックが必要です。
- 1. なぜinitメソッドで(self)をチェックするのですか?
- 2. なぜ「[self class] == [super class]」ですか?
- 3. なぜ "picker.delegate = self needed"ですか?
- 4. メッセージnilが効果を持たない場合、なぜself!= nilで-initをチェックするのですか?
- 5. self .__ class__をチェックする目的は何ですか? - python
- 6. なぜarrayのオブジェクトにオブジェクトメソッドがないのですか?
- 7. なぜ "class << self"式を使用するのですか?
- 8. PHPでselfを返すことができないのはなぜですか?
- 9. なぜattr_accessorはextend selfでモジュールで動作しますか?
- 10. Javascriptのクラスで "var self = this"が必要なのはなぜですか?
- 11. SPFチェックで「ソフトフェイル」が発生するのはなぜですか?
- 12. なぜこのインスタンスメソッドの中に `self`が必要ですか?
- 13. なぜ `yield self`が役立つのですか?
- 14. なぜ "self"を使ってActiveRecord/Railsモデルのプロパティにアクセスするのですか?
- 15. このnullチェックが失敗するのはなぜですか?
- 16. なぜ "self"で設定値がメモリリークを引き起こすのですか?
- 17. Selfまたは関連タイプのプロトコルの制限はなぜですか?
- 18. コンソールクラスがオブジェクトから派生している場合、なぜオブジェクトメソッドを使用できないのですか?
- 19. [self release]、[self retain]を使うのは良いアプローチですか?
- 20. 客観的なcの中で[self self]は何を意味しますか?
- 21. HttpWebOperationのタイムアウト。なぜ、何をチェックするのですか?
- 22. ifとelseifの両方でブレードをチェックするのはなぜですか?
- 23. getattr()がselfよりもずっと遅いのはなぜですか?__ dict __。get()?
- 24. ラジオボタンがチェックされていないのはなぜですか?
- 25. なぜマジックメソッドのオーバーロードで "self"を返す必要がありますか?
- 26. Cでオブジェクトメソッドをエミュレートすることは可能ですか?
- 27. `self`とはcreate(self、validated_data)メソッドの意味ですか?
- 28. Javascript:なぜ名前オブジェクトメソッド関数
- 29. @ContentChildrenは一致するセレクタにクエリを実行すると、なぜself(this)を含むのですか?
- 30. ES5のオブジェクトメソッドがObject.prototypeに追加されなかったのはなぜですか?
私は、このサンプルコードが実際の問題をまったくバイパスしているとは言いません。それどころか、問題を明示的に強調しています。 –