-sizeWithFont在设备上的功能不同

时间:2010-04-13 19:14:33

标签: iphone layout fonts nsstring null

因此,在使用NSString的{​​{1}}系列方法调用时,我似乎遇到了一些奇怪的行为,具体取决于我是否在iPhone模拟器或实际设备上调用它。

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

模拟器:

constrainedToSize:

设备:

someString: (null)
someStringSize: {0, 0}

模拟器上的行为是我所期望的。并不是说这个问题很难避免,但是1)我有点困惑为什么这个函数系列在模拟器和实际设备上表现不同,以及2)为什么在someString: (null) someStringSize: {185, 3.40282e+38} 接收器上调用方法返回特定的,确定性的结果?

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

编辑:我想我应该提一下,我正在构建3.1 SDK。

1 个答案:

答案 0 :(得分:5)

Apple关于Sending messages to nil的文档解释了这一点:

  

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

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

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