-sizeWithFont在设备上的功能不同

CIF*_*ter 3 iphone null layout fonts nsstring

所以我使用的时候似乎遇到了一些奇怪的行为NSString-sizeWithFont取决于我是否正在调用它在iPhone模拟器或实际设备的方法调用的家庭.

简单地说,当-sizeWithFont:constrainedToSize:lineBreakMode:方法调用的接收者是nil,CGSize在模拟器上传回的结果是{0, 0}.但是,在设备上,返回结果与CGSize我在方法调用中指定的值相同,作为constrainedToSize:参数.请参阅以下日志语句:

模拟器:

someString: (null)
someStringSize: {0, 0}
Run Code Online (Sandbox Code Playgroud)

设备:

someString: (null)
someStringSize: {185, 3.40282e+38}
Run Code Online (Sandbox Code Playgroud)

模拟器上的行为是我所期望的.并不是说这个问题很难避免,但是1)我有点困惑为什么这个函数系列在模拟器和实际设备上表现不同,以及2)为什么在nil接收器上调用方法会返回一个特定的,确定的结果?

感谢您提供的任何指示或见解!

编辑:我想我应该提到我正在构建3.1 SDK.

Ole*_*ann 5

Apple关于发送消息的文档为nil解释了这一点:

从消息返回到nil的值也可能是有效的:

  • 如果方法返回一个对象,则发送给nil的消息返回0(nil)...
  • 如果方法返回任何指针类型,任何大小小于或等于sizeof(void*),float,double,long double或long long的整数标量,则发送到nil的消息将返回0.
  • 如果该方法返回一个结构,如Mac OS X ABI函数调用指南所定义的那样在寄存器中返回,那么发送给nil的消息将为数据结构中的每个字段返回0.0.其他结构数据类型不会用零填充.
  • 如果该方法返回除上述值类型之外的任何内容,则发送到nil的消息的返回值是未定义的.

虽然本文档没有具体谈及iPhone(它是在iPhone SDK发布之前编写的),但请注意第三和第四个要点:如果方法返回结构(例如CGSize),则行为与平台有关.只有在CPU寄存器中返回的值才会用零填充.我不是iPhone的ARM体系结构的专家,但很可能在iPhone上,返回值sizeWithFont:不会在寄存器中返回,而不是i386.在这种情况下,在模拟器上运行时,返回的结构将填充零,而在iPhone上运行时,该值将是未定义的.

  • 正如我所说,我只是在推测,但我的预感是,在ARM体系结构中,方法的返回值通常与`constrainedToSize:`参数放在相同的内存位置/相同的寄存器中. (2认同)