在 objective-c 中,应用程序在未找到响应者时崩溃,但在将消息发送到 nil 对象时不会崩溃。这是为什么?
In objective-c, app crash when a responder is not found but does not crash when a message is sent to nil object. Why is that?
感谢您提出这个问题。我对 NULL 指针异常的想法很满意。
现在使用 Objective-C 我已经接受了这样的想法,即您可以向 nil 发送消息并且不会发生任何不好的事情(它已经深入我的脑海)。
问题是为什么应用程序在找不到选择器时会崩溃,但向 nil 发送消息时不会崩溃?
我最近在尝试注册 NSNotification 并未能实现该方法时看到了这一点。
我很好奇为什么会出现上述情况(或者不是,也许我真的不明白)。如果你能告诉我它与 Swift.
有何不同,请加分
提前致谢。
我认为这里的区别在于您尝试调用该方法的对象。
当向 nil 对象发送消息时,nil 可以响应发送给它的任何消息,据我所知总是返回 nil,因此 nil 能够处理对它的任何方法调用。 (也许在 obejctive-c 的底层结构中,在它尝试 运行 nil 上的选择器之前,它只是 returns nil,所以它不会崩溃,因为它永远不需要找到选择器.. .我只是在这里理论化,但也许这是一个很好的看待它的方式)
当一个对象找不到选择器时,在这里你试图向一个对象(不是 nil)发送一条消息给 运行 一个它没有的选择器,因此不知道如何处理这种情况,只是崩溃。
首先:您确定您正确使用了响应者这个词吗?它是 Cocoa 开发中的定义术语。您可能想使用接收者一词。
给你的问题:
有一个主要区别:对象是否存在(又名引用是nil
)在运行时可确定。此外,没有任何参考是您可以期望的。 (好的,Swift 开发人员会就此进行协商。)
但您总是希望接收者的类型适合您的消息。即使在 Objective-C 发送消息时打字也是动态的,您会希望接收者接受(知道)该消息。甚至在编译时也无法确定类型,在大多数情况下,编译器可以采用预期的类型。所以他会警告你。
如果您明确使用 Objective-C 的动态功能,您只会进入那个陷阱。 (通知、撤消管理、通用容器……)
感谢您提出这个问题。我对 NULL 指针异常的想法很满意。
现在使用 Objective-C 我已经接受了这样的想法,即您可以向 nil 发送消息并且不会发生任何不好的事情(它已经深入我的脑海)。
问题是为什么应用程序在找不到选择器时会崩溃,但向 nil 发送消息时不会崩溃?
我最近在尝试注册 NSNotification 并未能实现该方法时看到了这一点。
我很好奇为什么会出现上述情况(或者不是,也许我真的不明白)。如果你能告诉我它与 Swift.
有何不同,请加分提前致谢。
我认为这里的区别在于您尝试调用该方法的对象。
当向 nil 对象发送消息时,nil 可以响应发送给它的任何消息,据我所知总是返回 nil,因此 nil 能够处理对它的任何方法调用。 (也许在 obejctive-c 的底层结构中,在它尝试 运行 nil 上的选择器之前,它只是 returns nil,所以它不会崩溃,因为它永远不需要找到选择器.. .我只是在这里理论化,但也许这是一个很好的看待它的方式)
当一个对象找不到选择器时,在这里你试图向一个对象(不是 nil)发送一条消息给 运行 一个它没有的选择器,因此不知道如何处理这种情况,只是崩溃。
首先:您确定您正确使用了响应者这个词吗?它是 Cocoa 开发中的定义术语。您可能想使用接收者一词。
给你的问题:
有一个主要区别:对象是否存在(又名引用是nil
)在运行时可确定。此外,没有任何参考是您可以期望的。 (好的,Swift 开发人员会就此进行协商。)
但您总是希望接收者的类型适合您的消息。即使在 Objective-C 发送消息时打字也是动态的,您会希望接收者接受(知道)该消息。甚至在编译时也无法确定类型,在大多数情况下,编译器可以采用预期的类型。所以他会警告你。
如果您明确使用 Objective-C 的动态功能,您只会进入那个陷阱。 (通知、撤消管理、通用容器……)