Objective-C未分配的指针

时间:2011-02-05 01:55:03

标签: objective-c pointers null

我对Objective-C中的nil感到困惑,因为apple说可以向nil对象发送消息。

所以假设这段代码:

Foo * myFoo;
[myFoo doSomeStuff];
在Xcode中,这不会崩溃,为什么呢? Objective-C中未分配的指针与nil相同。

感谢。

2 个答案:

答案 0 :(得分:3)

因为nilrandom garbage之间存在差异。你看,这一行:

Foo * myFoo;
如果您没有明确设置,{p>不会保证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();
}

答案 1 :(得分:3)

这取决于变量。实例变量,全局变量或静态变量将初始化为nil,除非您将其初始化为其他内容。普通的局部变量没有初始化为任何定义的值,并且传递这样的变量通常会崩溃。请注意,通常是,而不是始终 - 当您谈论未定义的行为时,几乎任何事情都可能发生,包括崩溃,发送到错误对象的消息或行为大部分时间似乎都是正确的,随意失败。