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

Aar*_*ron 1 iphone location objective-c cllocationmanager ios

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

CLLocation* loc = nil;
[self passMeCoordinates:loc.coordinate];
Run Code Online (Sandbox Code Playgroud)

Jes*_*sak 5

这是个有趣的问题.我假设你的早期代码是:

[self passMeCoordinates:nil];
Run Code Online (Sandbox Code Playgroud)

编译器抱怨这个,因为CLLocationCoordinate2D不是一个对象.这是一个C风格的结构.因此,您无法传递期望结构的对象/指针(nil).(它们的大小不一样等)

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

CLLocation* loc = nil;
CLLocationCoordinate2D coord = loc.coordinate;
[self passMeCoordinates:coord];
Run Code Online (Sandbox Code Playgroud)

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

LLVM 3.0+(Xcode 4.2+):返回全零,所以它相当于(0,0)的坐标:我可以依靠nil UIView返回CGRectZero作为其框架吗?

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