2011-02-05 8 views
0

私はObject-Cでnilを混乱させています。原因はappleが原因でnilオブジェクトにメッセージを送信しても問題ありません。Objective-C unallocated pointer

ので、このコードは考えます:Xcodeで

Foo * myFoo; 
[myFoo doSomeStuff]; 

これはなぜクラッシュしませんか? objective-Cの未割り当てポインタはnilと同じです。

ありがとうございました。

+0

はグローバル変数myFooですか?これらは常に0に初期化されます。 – pt2ph8

+0

myFooはグローバル変数ではありません。 – iPadDevloperJr

+0

@Gallois:割り当てられていないポインタと初期化されていないポインタの間に違いがあります。初期化されていないポインタがあり、その答えが説明されているように、ポインタがスタック(ローカル変数)に割り当てられ、初期化されていないときの動作は未定義です。 –

答えて

3

nilrandom garbageの間に違いがあるためです。あなたが明示的に設定しない場合

Foo * myFoo; 

myFooの値のいずれかの保証がありません:あなたは、この行を参照してください。

Foo* myFoo; 
printf("%x\n", myFoo); 

0は印刷されない可能性があります。代わりに、そのメモリ位置にあった最後のものを出力します。しかし、それは非常にうまくいかないかもしれません。

ローカル変数は、自分で割り当てる前に未定義の値を持っています。 Objective-Cランタイムはnilへの呼び出しを許可しますが、nilは厳密にゼロに定義されているため、この機能を使用するには変数をnilに初期化する必要があります(そうしないと、あなたのプログラムではランダムなアドレスは良くありません)。

これは常に(「仕事」私はクラッシュしないわけによる)、「仕事」になります。

Foo* myFoo = nil; 
[myFoo whatever]; 

ここでは、私のマシンで、一貫してポインタをゼロに持っていない、プログラム例です:

#include <stdio.h> 
#include <string.h> 

struct random_stuff 
{ 
    int stuff[60]; 
}; 

struct random_stuff scramble() 
{ 
    int filler = 0xdeadbeef; 
    struct random_stuff foo; 

    memset_pattern4(&foo.stuff, &filler, sizeof foo); 
    return foo; 
} 

void print() 
{ 
    void* pointer[30]; 
    for (int i = 0; i < 30; i++) 
     printf("%p\n", pointer[i]); 
} 

int main() 
{ 
    scramble(); 
    print(); 
} 
+0

私はそれを試して0を印刷します。 – iPadDevloperJr

+0

@Gallois非常に単純なプログラム(主な方法)では、それは0を出力する可能性が非常に高いです。私は '0'を出力しない例で更新します。 – zneak

+0

ありがとう、私の問題は、これはクラッシュしないということです。 Objective-Cは割り当てられていないポインタをnilと同じ扱いにしているようです。 – iPadDevloperJr

3

これは変数によって異なります。インスタンス変数、グローバル変数、または静的変数は、他のものに初期化しない限り、nilに初期化されます。通常のローカル変数は、定義された値に初期化されず、通常はクラッシュするような変数をメッセージします。それはで、通常であり、ではなく、常にであることに注意してください。 - 定義されていない動作については、クラッシュ、間違ったオブジェクトへのメッセージ、ほとんどの場合正しいと思われるメッセージやランダム。

関連する問題