2011-02-05 106 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。一个普通的局部变量没有初始化为任何已定义的值,并且发送类似这样的变量通常会崩溃。请注意,这是通常,不总是 - 当你谈论不确定的行为,任何事情是可能的,包括崩溃,消息会在错误的对象,或者说似乎是正确的大部分时间并随机失败行为。