我对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