objective-c – 发送消息到nil?

objective-c – 发送消息到nil?,第1张

概述作为一名正在阅读苹果的Objective-C 2.0文档的Java开发人员:我想知道向nil发送消息意味着什么 – 更不用说它是如何实用的。摘录文档: There are several patterns in Cocoa that take advantage of this fact. The value returned from a message to nil may also be v 作为一名正在阅读苹果的Objective-C 2.0文档的Java开发人员:我想知道向nil发送消息意味着什么 – 更不用说它是如何实用的。摘录文档:

There are several patterns in Cocoa
that take advantage of this fact. The
value returned from a message to nil
may also be valID:

If the method returns an object,any pointer type,any integer scalar
of size less than or equal to
sizeof(voID*),a float,a double,a
long double,or a long long,then a
message sent to nil returns 0. If the method returns a struct,as defined by the Mac OS X ABI Function
Call GuIDe to be returned in
registers,then a message sent to nil
returns 0.0 for every fIEld in the
data structure. Other struct data
types will not be filled with zeros. If the method returns anything other than the aforementioned value
types the return value of a message
sent to nil is undefined.

有Java让我的大脑无法解释上面的解释?还是有一些我缺少的东西,会使这清楚如玻璃?

注意:是的,我确实得到了Objective-C中的消息/接收器的想法,我只是困惑一个接收器恰好是零。

解决方法 嗯,我认为可以用一个非常有价值的例子来描述。假设你有一个Java中的方法打印出ArrayList中的所有元素:

voID foo(ArrayList List){    for(int i = 0; i < List.size(); ++i){        System.out.println(List.get(i).toString());    }}

现在,如果你像这样调用该方法:someObject.foo(NulL);你可能会得到一个NullPointerException当它试图访问列表,在这种情况下在调用List.size();现在,你可能永远不会调用someObject.foo(NulL)与这样的NulL值。然而,你可能已经从一个方法返回NulL,如果它运行一些错误生成ArrayList像someObject.foo(otherObject.getArrayList());

当然,如果你做这样的事情,你也会有问题:

ArrayList List = NulL;List.size();

现在,在Objective-C中,我们有等效的方法:

- (voID)foo:(NSArray*)anArray{    int i;    for(i = 0; i < [anArray count]; ++i){        NSLog(@"%@",[[anArray objectAtIndex:i] stringValue];    }}

现在,如果我们有以下代码:

[someObject foo:nil];

我们有相同的情况,Java会产生一个NullPointerException。 nil对象将首先访问[anArray count]。但是,Objective-C不会抛出一个NullPointerException,而是根据上面的规则返回0,所以循环不会运行。然而,如果我们将循环设置为运行设置的次数,那么我们首先在[anArray objectAtIndex:i]上向anArray发送消息;这也将返回0,但是因为objectAtIndex:返回一个指针,并且指向0的指针是nil / NulL,NSLog将每次通过循环传递nil。 (虽然NSLog是一个函数,而不是一个方法,它打印输出(null)如果传递一个nil Nsstring。

在某些情况下,有一个NullPointerException更好,因为你可以立即告诉程序有问题,但除非你捕获异常,程序将崩溃。 (在C中,试图以这种方式取消引用NulL会导致程序崩溃。)在Objective-C中,它只是引起可能不正确的运行时行为。然而,如果你有一个方法,如果它返回0 / nil / NulL /一个零结构不打破,那么这可以避免你必须检查,以确保一个或多个对象为零。

总结

以上是内存溢出为你收集整理的objective-c – 发送消息到nil?全部内容,希望文章能够帮你解决objective-c – 发送消息到nil?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1049229.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存