29

次のようなコードを見てきました:

if (delegate != nil && [delegate respondsToSelector:@selector(doSomething)]) ...

しかし、メッセージを に送信すると(これは に評価されます)nilが返されるだけなので、次のようにしない理由はありません。nilNO

if ([delegate respondsToSelector:@selector(doSomething)]) ...

の場合、前者の方が速いですdelegate == nilか?いずれにせよ、コードが少ないため、後者を好みます。

そして、lessよりも優れていmoreます。すべての Unix プロはそれを知っています。

4

3 に答える 3

24

objc_msgSend、Objective-Cで動的メッセージを送信するために使用される関数は、最初の引数(メッセージ受信者)をすぐにチェックし、==nilの場合に返します。したがって、nilメッセージングの唯一のオーバーヘッドは、動的にリンクされたライブラリ関数呼び出しです。これは、「バイナリ内」関数呼び出しよりもわずかにコストがかかります。全体として、一方のアプローチはもう一方のアプローチよりも効率的ですか?複合条件ステートメントは通常、追加の分岐を必要とするため、コンパイラーが生成するコードを見ずに答えを判断することはできませんが、より重要なのは、実行中のプログラムのプロファイリングです。時期尚早の最適化はBadThing™ですが、実際に効率を検討し、このような「イディオム」に疑問を投げかけたことを祝福します。

于 2011-06-25T17:24:28.617 に答える
5

あなたは正しいです。に送信されたメッセージは自動的nilに返されるため、これは Obj-C では技術的に不要なオーバーヘッドです。ただし、最初に であるかどうかを確認nilして への呼び出しを無視すると、呼び出しのオーバーヘッドがスキップされます。そうすればもっと速くなるでしょうが、どの程度かはわかりません。respondsToSelector:nilrespondsToSelector:

于 2011-06-25T17:13:11.310 に答える
-3

ここには構文上の問題があります。-respondsToSelector を nil オブジェクトに送信すると、常に nil が返されます。これが、あなたがそのようなことをする理由です。

于 2012-03-12T06:06:49.843 に答える