Objective-C中的空指针取消引用是否为未定义的行为?

在C和C ++中,空指针取消引用是未定义的行为。 Objective-C怎么样?

换句话说,这个代码保证做什么?

*(long*)0 = 0; 

背景:我想知道这个答案是否可能触发未定义的行为,可能导致随机的事情,如声明被优化或甚至更奇怪的东西。

当然,我不认可这样做。 但是,了解语言规则也很重要。

由于Objective-C只不过是在C之上的面向对象层,纯C语句没有特殊的附加含义。 据此,在这种情况下, *(long*)0 = 0; 就像在C中一样被评估和解释(因为它 C),因此它调用未定义的行为。 因此,不保证做任何事情。

取消引用空指针在Objective-C中仍未定义。

唯一需要注意的是,消息传递不需要取消引用。 传递给空指针(或Objective-C术语中的nil )始终是显式安全的,并定义为返回另一个空指针。

因此,复合消息传递(如[[class alloc] init] )始终是显式安全的。

该语句唯一保证的是调用未定义的行为。

可以保证使用特定编译器在特定平台上执行特定操作。

一个strcpy(0,“bla”),如该答案中所见,总是崩溃,我不知道它是如何工作的 – 或者被编译器优化掉。