我對objective-C中的nil感到困惑,因爲蘋果說可以將消息發送給一個零對象。Objective-C未分配指針
所以想驗證碼:
Foo * myFoo;
[myFoo doSomeStuff];
在Xcode這不會崩潰,爲什麼? objective-C中未分配的指針與nil相同。
謝謝。
我對objective-C中的nil感到困惑,因爲蘋果說可以將消息發送給一個零對象。Objective-C未分配指針
所以想驗證碼:
Foo * myFoo;
[myFoo doSomeStuff];
在Xcode這不會崩潰,爲什麼? 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();
}
它取決於變量。除非將其初始化爲其他值,否則實例變量,全局變量或靜態變量將初始化爲nil。一個普通的局部變量沒有初始化爲任何已定義的值,並且發送類似這樣的變量通常會崩潰。請注意,這是通常,不總是 - 當你談論不確定的行爲,任何事情是可能的,包括崩潰,消息會在錯誤的對象,或者說似乎是正確的大部分時間並隨機失敗行爲。
是`myFoo`全局變量嗎?這些總是被初始化爲零。 – pt2ph8 2011-02-05 01:58:42
myFoo不是全局變量。 – iPadDevloperJr 2011-02-05 02:02:01