1

假设我有一个采用 CLLocationCoordinate2D 的方法。我不能在代码中直接将 nil 传递给它;编译器抱怨。但是,以下编译。那么在运行时会发生什么?

CLLocation* loc = nil;
[self passMeCoordinates:loc.coordinate];
4

4 回答 4

5

这是个有趣的问题。我假设您之前的代码是:

[self passMeCoordinates:nil];

编译器对此抱怨,因为 CLLocationCoordinate2D 不是对象。这是一个 C 风格的结构。因此,您不能在需要结构的地方传递对象/指针(nil)。(它们的大小不同等)

如果我将您的代码稍微解释为:

CLLocation* loc = nil;
CLLocationCoordinate2D coord = loc.coordinate;
[self passMeCoordinates:coord];

问题归结为“有什么价值coord”。您可能知道,Objective-C 中的规则是,如果您向 nil 发送消息(就像我们在这里所做的那样 - loc.coordinate 等价于 [loc coordinate]),那么您将返回 0。但是如果我们'重新期待一个结构?正如我刚才提到的,它与整数的大小不同。好吧,事实证明结果取决于您使用的编译器:

LLVM 3.0+(Xcode 4.2+):返回全零,因此它相当于(0,0)的坐标:我可以依靠 nil UIView 返回 CGRectZero 的帧吗?

LLVM 早期/GCC:一个结构可以填充垃圾/未定义的内容,所以它可以是任何东西。

于 2012-12-13T23:35:45.260 回答
1

Loc.coordinate 是一种结构,因此您不能为此传递 nil 。
并且返回 C 结构的方法在 nil 上调用是不安全的。因此,您的警告不是关于将 nil 作为参数传递。

至于你关于 nil 作为论点的问题。好吧,这取决于方法,有些可以优雅地处理 nil ,有些则不会。如果您可以或不能将 nil 作为参数传递,请参阅通常所说的那些方法的文档。

于 2012-12-13T23:31:56.553 回答
1

正如其他人指出的那样,您正在处理对象的struct属性location,因此nil会有问题。您应该只nil与对象一起使用。

但更一般地说,你永远不应该假设任何方法都会接受nil作为参数。这一切都因方法而异。对于内置类,它通常会在文档中指定nil参数何时可接受。如果它没有说这nil是允许的,那么明智的做法是假设它不是。

您自己的代码是否接受nil参数完全取决于您对该参数所做的操作,以及您是否正在做任何需要它不接受的事情,nil您的代码是否正在检查非nil值并进行适当处理等。

作为一个完全随机的例子,如果你有一个方法:

NSMutableArray *array = [NSMutableArray array];
[array addObject:text];

如果is ,这将产生一个NSInvalidArgumentException异常。textnil

归根结底,这一切都因方法而异。请参阅相关方法的文档以查看是否nil允许。

“除非文档说明可以,否则不要使用nil”规则的一个一般例外是,在向对象发送消息时nil(即调用对象上的方法nil)。这是允许的(但显然什么都不做)。正如文档所说:

在 Objective-C 中,您通常可以发送消息nil而不会产生不良影响。只要将返回的内容键入为对象,就可以保证发送到 nil 的消息的返回值有效。

于 2012-12-13T23:35:19.560 回答
0

在运行时 nil 将被传递给您的方法。编译器不做运行时检查,它只做编译时类型检查。

于 2012-12-13T23:32:31.550 回答