Obj.C

obj.C:初期化nilと [NSArray new]の違い

基本のところで誤解があって、それでうまく動いていたので修正前と修正後と比較しています。

整理すると次のようになります。初期化するとき、nilと [NSArray new]とでは、結果が違います。この意味を取り違えて修正前のものがそれなりに正しく動いていたのですが、その理由を調べようとしたら、この基本問題にあたってしまいました。

     NSArray *wNil;

  wNil = nil;
if (!wNil)   //nilのときYESで実行される
        NSLog (@”1. if (!wNil)=%@ 行数=%ld”,wNil,[wNil count]);
if (wNil)
NSLog (@”2. if (wNil)=%@ 行数=%ld”,wNil,[wNil count]);

if (wNil == nil)  //nilのときYESで実行される。
        NSLog (@”3. if (!wNil)=%@ 行数=%ld”,wNil,[wNil count]);
if (wNil != nil)
NSLog (@”4. if (wNil)=%@ 行数=%ld”,wNil,[wNil count]);

wNil = [NSArray new];
if (!wNil)
NSLog (@”5. if (!wNil)=%@ 行数=%ld”,wNil,[wNil count]);
if (wNil)  //初期化でobjが0個でも、YESで実行される。
        NSLog (@”6. if (wNil)=%@ 行数=%ld”,wNil,[wNil count]);

if (wNil == nil)
NSLog (@”7. if (!wNil)=%@ 行数=%ld”,wNil,[wNil count]);
if (wNil)  //初期化でobjが0個でも、YESで実行される。
        NSLog (@”8. if (wNil)=%@ 行数=%ld”,wNil,[wNil count]);

wNil = [NSArray new];
wNil = [NSArray arrayWithObjects: @”Where”, nil];// copy];
if (wNil == nil)
NSLog (@”9. if (!wNil)=%@ 行数=%ld”,wNil,[wNil count]);
if (wNil != nil)  //初期化でobjが0個でも、YESで実行される。
        NSLog (@”10. if (wNil)=%@ 行数=%ld”,wNil,[wNil count]);

if (!wNil)
        NSLog (@”11. if (!wNil)=%@ 行数=%ld”,wNil,[wNil count]);
if (wNil)
NSLog (@”12. if (wNil)=%@ 行数=%ld”,wNil,[wNil count]);

これから言えることは次の通り。

  • if (!変数)とif(変数 == nil)は同じ。

    ➡nilのとき、もしくは変数がないときはYES
    ➡[NSArray new]で初期化したときはNO

  • if'(変数)とif(変数 != nil)は同じ。

    ➡オブジェクトが存在するのときYES (10)
    (これはnilでないときでもある)
    ➡[NSArray new]で初期化したときはYESなので注意 (8)

 

Categories: Obj.C, 技術

Tagged as: , ,