繁体   English   中英

Objective-C未分配的指针

[英]Objective-C unallocated pointer

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

所以假设这段代码:

Foo * myFoo;
[myFoo doSomeStuff];

在Xcode中不会崩溃,为什么呢? 在objective-C中未分配的指针与nil相同。

谢谢。

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

它取决于变量。 实例变量,全局变量或静态变量将初始化为nil,除非您将其初始化为其他变量。 普通的局部变量不会初始化为任何定义的值,并且像这样传递变量通常会崩溃。 请注意, 通常这并非总是如此 -当您谈论未定义的行为时,几乎所有可能的事情都可能发生,包括崩溃,发往错误对象的消息,或在大多数情况下似乎正确且随机失败的行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM