簡體   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