iphone - 如果您在运行时将 nil 传递给不应接受的参数会发生什么?

标签 iphone objective-c ios location cllocationmanager

假设我有一个采用 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/

相关文章:

ios - UITableViewRowAction 在按下时更改背景颜色

android - Android、IOS 和 Windows Phone 上的应用程序 UI 相同

ios - native 模块不能为空。 | react native

swift - 有没有办法在 Swift 中立即发送本地通知?

ios - Xcode - 如何将程序员的名字更改为公司?

ios - 如何将 NSPredicate 与链式虚拟属性(property)一起使用?

Objective-C:我的 int 值不是我期望的值

iphone - UINavigationController 和备用景观

iphone - 如何在 xcode4.3 中获取和修改显示屏幕大小

ios - 尽管桥接头工作正常,但无法在 Swift 中实例化 Obj C 类