假设我有一个采用 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
有什么值(value)”。您可能知道,Objective-C 中的规则是,如果您向 nil 发送消息(就像我们在这里所做的那样 - loc.coordinate 等价于 [loc coordinate]),那么您将返回 0。但是如果我们'重新期待一个结构?正如我刚才提到的,它与整数的大小不同。好吧,事实证明结果取决于您使用的编译器:LLVM 3.0+ (Xcode 4.2+):返回全零,所以它等价于 (0,0) 的坐标:Can I rely on nil UIView returning CGRectZero for its frame?
LLVM 早期/GCC:一个结构可以填充垃圾/未定义的内容,所以它可以是任何东西。
关于iphone - 如果您在运行时将 nil 传递给不应接受的参数会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13870356/