[英]Objective-C unallocated pointer
我對Objective-C中的nil感到困惑,因為apple表示可以將消息發送到nil對象。
所以假設這段代碼:
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,除非您將其初始化為其他變量。 普通的局部變量不會初始化為任何定義的值,並且像這樣傳遞變量通常會崩潰。 請注意, 通常這並非總是如此 -當您談論未定義的行為時,幾乎所有可能的事情都可能發生,包括崩潰,發往錯誤對象的消息,或在大多數情況下似乎正確且隨機失敗的行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.