假设我有一个采用 CLLocationCoordinate2D 的方法。我不能在代码中直接将 nil 传递给它;编译器抱怨。但是,以下编译。那么在运行时会发生什么?
CLLocation* loc = nil;
[self passMeCoordinates:loc.coordinate];
假设我有一个采用 CLLocationCoordinate2D 的方法。我不能在代码中直接将 nil 传递给它;编译器抱怨。但是,以下编译。那么在运行时会发生什么?
CLLocation* loc = nil;
[self passMeCoordinates:loc.coordinate];
这是个有趣的问题。我假设您之前的代码是:
[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:一个结构可以填充垃圾/未定义的内容,所以它可以是任何东西。
Loc.coordinate 是一种结构,因此您不能为此传递 nil 。
并且返回 C 结构的方法在 nil 上调用是不安全的。因此,您的警告不是关于将 nil 作为参数传递。
至于你关于 nil 作为论点的问题。好吧,这取决于方法,有些可以优雅地处理 nil ,有些则不会。如果您可以或不能将 nil 作为参数传递,请参阅通常所说的那些方法的文档。
正如其他人指出的那样,您正在处理对象的struct
属性location
,因此nil
会有问题。您应该只nil
与对象一起使用。
但更一般地说,你永远不应该假设任何方法都会接受nil
作为参数。这一切都因方法而异。对于内置类,它通常会在文档中指定nil
参数何时可接受。如果它没有说这nil
是允许的,那么明智的做法是假设它不是。
您自己的代码是否接受nil
参数完全取决于您对该参数所做的操作,以及您是否正在做任何需要它不接受的事情,nil
您的代码是否正在检查非nil
值并进行适当处理等。
作为一个完全随机的例子,如果你有一个方法:
NSMutableArray *array = [NSMutableArray array];
[array addObject:text];
如果is ,这将产生一个NSInvalidArgumentException
异常。text
nil
归根结底,这一切都因方法而异。请参阅相关方法的文档以查看是否nil
允许。
“除非文档说明可以,否则不要使用nil
”规则的一个一般例外是,在向对象发送消息时nil
(即调用对象上的方法nil
)。这是允许的(但显然什么都不做)。正如文档所说:
在 Objective-C 中,您通常可以发送消息
nil
而不会产生不良影响。只要将返回的内容键入为对象,就可以保证发送到 nil 的消息的返回值有效。
在运行时 nil 将被传递给您的方法。编译器不做运行时检查,它只做编译时类型检查。