2011-02-05 126 views
0

我對objective-C中的nil感到困惑,因爲蘋果說可以將消息發送給一個零對象。Objective-C未分配指針

所以想驗證碼:

Foo * myFoo; 
[myFoo doSomeStuff]; 

在Xcode這不會崩潰,爲什麼? objective-C中未分配的指針與nil相同。

謝謝。

+0

是`myFoo`全局變量嗎?這些總是被初始化爲零。 – pt2ph8 2011-02-05 01:58:42

+0

myFoo不是全局變量。 – iPadDevloperJr 2011-02-05 02:02:01

回答

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(); 
} 
3

它取決於變量。除非將其初始化爲其他值,否則實例變量,全局變量或靜態變量將初始化爲nil。一個普通的局部變量沒有初始化爲任何已定義的值,並且發送類似這樣的變量通常會崩潰。請注意,這是通常,不總是 - 當你談論不確定的行爲,任何事情是可能的,包括崩潰,消息會在錯誤的對象,或者說似乎是正確的大部分時間並隨機失敗行爲。