【发布时间】:2010-11-07 15:24:05
【问题描述】:
刚开始看Objective-C的教程,有一节是“给nil发消息”:
Cocoa 中有几种模式 利用这一事实。这 从消息返回到 nil 的值 也可能有效:
这是什么意思?我好像跟不上。
【问题讨论】:
标签: objective-c null
刚开始看Objective-C的教程,有一节是“给nil发消息”:
Cocoa 中有几种模式 利用这一事实。这 从消息返回到 nil 的值 也可能有效:
这是什么意思?我好像跟不上。
【问题讨论】:
标签: objective-c null
您可以向 nil 发送任何消息。什么都没发生。
您在这些文档中到底有哪些不明白的地方?
【讨论】:
它做你所期望的:什么都没有。
【讨论】:
nil 的特殊处理意味着您可以执行以下操作:
SomeClass * someObject;
someObject = nil;
[someObject doSomething];
您可以放心,不会发生任何事情。
现在,为什么这很重要?
在 Objective-C 中,向对象发送消息意味着告诉该对象做某事,或要求该对象提供一些信息。一些例子:
[someObject updateRecords]; // 1
x = [someObject size]; // 2
第 1 行向 someObject 发送一条名为 updateRecords 的消息,第 2 行向同一对象发送一条名为 size 的消息,该消息预计会返回一个值。这些消息归结为方法调用,最终运行的实际代码由 Objective-C 运行时系统确定,因为 Objective-C 是一种动态类型语言。
为了确定调用哪个方法,运行时系统从相关对象的地址(someObject,在上面的示例中)读取信息,以确定它是哪个类的实例。使用这些信息,它能够查找要调用的适当方法,当所有这些都弄清楚后,它就会执行方法中的代码。
如果运行时系统没有将nil 视为特殊情况,如果您尝试执行顶部显示的代码,它可能会崩溃。 nil 被定义为零,因此运行时将从存储在内存中位置零的地址开始读取信息,这几乎可以保证是访问冲突。
【讨论】:
[someObject release]; [someObject someMethod];。这与someObject = nil; [someObject someMethod]; 非常不同@ 即使将 someObject 设置为 nil 可能会在 GC 环境中释放它,但将其设置为 nil 的行为也会阻止您向 deallocated 内存发送消息。
与 C# 等其他语言相比,nil 消息传递的好处在于,您可以编写执行多个方法调用的代码,而无需在每一步都测试 nil。
id obj1 = [SomeClass object];
id obj2 = [obj1 doSomething];
id obj3 = [obj2 anotherMethod];
id thingICareAbout = [obj3 doSomethingElse];
如果你通过几个步骤到达thingICareAbout,它会节省很多不必要的代码行,而不必在使用之前测试obj1、obj2等是否为nil。如果需要,您可以在最后检查 thingICareAbout 是否为 nil 一次。有时您甚至不必这样做,如果您的代码在其为 nil(或原始值为 0)时仍然有效。
在 C# 中,您必须明确检查每个对象是否为 nil,围绕该代码块设置异常处理,或者只是希望中间对象都不是 nil。
要记住的另一件事(我刚刚学会了!)是 10.5 改变了这种行为——过去它只对整数和指向对象的指针是安全的,而不是结构或浮点值。因此,当您查看其他代码时,您可能会看到一些额外的错误检查。
【讨论】:
【讨论】: