5

私は多くのObjCコードを見てきました:

obj = [[SomeObject alloc] init];
if (obj) {
/// ...
}

しかし、私が理解したように、()内の値はブール値であり、0はFALSEを示します1はTRUEを示します(他の言語では、0がtrueで1がfalseである別のケースがあります)。これはNULL(nil)に設定されており、これは#definedで0に定義されているので、次のようにするとよいのではないかと思います。

if (obj != nil) {
/// ...
}

objがnilであるかどうかをチェックしているので、値が何であっても、それ(または)がたまたま0として定義されていることにnil依存していませんか?nilNULL

4

2 に答える 2

5

編集: 少しテストした後、私は最近のコンパイラが実際には両方の場合に同じマシンコードを作成することを決定しました;

元の投稿:

(無視できるほど)使用する方が効率的です

if(obj) {

(比較式を評価することにより)中間ブール値を作成する必要がないためです。ゼロ以外がFALSEであるという点で、どの「他の言語」を参照しているのかわかりません。私が考えることができる最も近いものは、「成功」の場合は0を返し、「エラー」の場合はそれ以外のcプログラムを返すことです。私がこれまでに使用したすべての現代語は、0をFALSEとして使用し、ゼロ以外の値をTRUEとして使用します。

Objective-Cでは、nilは文字通り0です(ポインターのように扱われます)。単なるゼロへのポインタではなく、ポインタとしてのゼロです。したがって、これは確実にFALSE(または、命名法では「NO」)と同等です。

少しテストした後で編集すると、最近のコンパイラは実際には両方の場合で同じマシンコードを作成することがわかりました。おそらくnilは本質的に0にtypedefされているため、2つのチェックスタイルが両方とも「このポインタがゼロ以外の場合」と言っていることがわかります。

于 2012-08-06T00:27:09.103 に答える
3

0はFALSEを示します1はTRUEを示します

選ぶ。C(およびObjective-C)では、0はfalseと評価され、ゼロ以外はtrueと評価されます。したがって、nil(またはNULL)ポインターは「false」ですが、nil以外のポインターはすべて「true」です。

あなたの例は本質的に同等です。どちらも他よりも「優れている」(あなたまたはあなたのコードベースにスタイル設定がない限り)。

于 2012-08-06T00:25:18.163 に答える