Ios 在objective-c中,应用程序在找不到响应程序时崩溃,但在向nil对象发送消息时不会崩溃。为什么呢?

Ios 在objective-c中,应用程序在找不到响应程序时崩溃,但在向nil对象发送消息时不会崩溃。为什么呢?,ios,objective-c,null,Ios,Objective C,Null,谢谢你提出这个问题。我对空指针异常的想法很满意 现在与Objective-C合作时,我已经习惯了这样一种想法:你可以向一个0发送一条消息,而不会发生任何不好的事情(这已经深入到我的头脑中) 问题是,为什么应用程序在找不到选择器时崩溃,而在向nil发送消息时却没有崩溃 我最近在尝试注册NSNotification但未能实现该方法时看到了这一点 我很好奇为什么会出现上述情况(或者不是,也许我真的不理解)。如果你能告诉我它与Swift有什么不同,那就多加一分 提前感谢。我认为这里的区别在于您试图调用的

谢谢你提出这个问题。我对空指针异常的想法很满意

现在与Objective-C合作时,我已经习惯了这样一种想法:你可以向一个0发送一条消息,而不会发生任何不好的事情(这已经深入到我的头脑中)

问题是,为什么应用程序在找不到选择器时崩溃,而在向nil发送消息时却没有崩溃

我最近在尝试注册NSNotification但未能实现该方法时看到了这一点

我很好奇为什么会出现上述情况(或者不是,也许我真的不理解)。如果你能告诉我它与Swift有什么不同,那就多加一分


提前感谢。

我认为这里的区别在于您试图调用的方法

当向nil对象发送消息时,nil可以响应发送给它的任何消息,据我所知,它总是返回nil,因此nil能够处理对它的任何方法调用。(可能在obejctive-c的底层结构中,在它尝试在nil上运行选择器之前,它只是返回nil,因此它不会崩溃,因为它不需要找到选择器……我只是在这里进行理论推导,但也许这是一个很好的方法来看待它)


当一个对象找不到选择器时,您将尝试向一个对象(不是nil)发送一条消息,以运行一个它没有的选择器,因此不知道如何处理这种情况而崩溃。

首先:您确定正确使用了术语responder吗?这是可可发展中的一个定义术语。您可能想使用“接收者”一词

对你的问题:

有一个主要区别:对象是否存在(即引用是
nil
)在运行时是可判定的。除此之外,你可以期望什么都没有提到。(好的,Swift开发者会就此进行协商。)

但是你总是希望接收者的类型适合你的信息。在Objective-C中,即使输入也是动态的,发送一条您希望接收者接受(知道)该消息的消息。即使类型也不能在编译时决定,在大多数情况下,编译器可以假定预期的类型。所以他警告你这一点

只有明确使用Objective-C的动态功能,才能进入这个陷阱(注释、撤销管理、通用容器等)