私はObject-Cでnilを混乱させています。原因はappleが原因でnilオブジェクトにメッセージを送信しても問題ありません。Objective-C unallocated pointer
ので、このコードは考えます:Xcodeで
Foo * myFoo;
[myFoo doSomeStuff];
これはなぜクラッシュしませんか? objective-Cの未割り当てポインタはnilと同じです。
ありがとうございました。
私はObject-Cでnilを混乱させています。原因はappleが原因でnilオブジェクトにメッセージを送信しても問題ありません。Objective-C unallocated pointer
ので、このコードは考えます:Xcodeで
Foo * myFoo;
[myFoo doSomeStuff];
これはなぜクラッシュしませんか? objective-Cの未割り当てポインタはnilと同じです。
ありがとうございました。
nil
とrandom 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を印刷します。 – iPadDevloperJr
@Gallois非常に単純なプログラム(主な方法)では、それは0を出力する可能性が非常に高いです。私は '0'を出力しない例で更新します。 – zneak
ありがとう、私の問題は、これはクラッシュしないということです。 Objective-Cは割り当てられていないポインタをnilと同じ扱いにしているようです。 – iPadDevloperJr
これは変数によって異なります。インスタンス変数、グローバル変数、または静的変数は、他のものに初期化しない限り、nilに初期化されます。通常のローカル変数は、定義された値に初期化されず、通常はクラッシュするような変数をメッセージします。それはで、通常であり、ではなく、常にであることに注意してください。 - 定義されていない動作については、クラッシュ、間違ったオブジェクトへのメッセージ、ほとんどの場合正しいと思われるメッセージやランダム。
はグローバル変数myFooですか?これらは常に0に初期化されます。 – pt2ph8
myFooはグローバル変数ではありません。 – iPadDevloperJr
@Gallois:割り当てられていないポインタと初期化されていないポインタの間に違いがあります。初期化されていないポインタがあり、その答えが説明されているように、ポインタがスタック(ローカル変数)に割り当てられ、初期化されていないときの動作は未定義です。 –