Iphone -sizeWithFont在设备上的功能不同

Iphone -sizeWithFont在设备上的功能不同,iphone,layout,fonts,nsstring,null,Iphone,Layout,Fonts,Nsstring,Null,因此,在使用NSString的-sizeWithFont方法调用家族时,我似乎遇到了一些奇怪的行为,这取决于我是在iPhone模拟器上还是在实际设备上调用它 简单地说,当-sizeWithFont:constrainedToSize:lineBreakMode:方法调用的接收器是nil时,在模拟器上传回的结果CGSize是{0,0}但是,在设备上,返回的结果与我在方法调用中指定的CGSize值相同,即constrainedToSize:参数。请参阅以下日志语句: 模拟器: someString:

因此,在使用
NSString
-sizeWithFont
方法调用家族时,我似乎遇到了一些奇怪的行为,这取决于我是在iPhone模拟器上还是在实际设备上调用它

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

模拟器:

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

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

谢谢你们的指点和见解

编辑:我想我应该提到我是在3.1 SDK的基础上构建的。

苹果关于这方面的文档解释了这一点:

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

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

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

是的,我记得从苹果的文档中读到过关于将消息发送到
nil
。但是,设备上的案例有趣的是,返回的结果是定义的:它始终是我传递给
-sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode:
抱歉的边界矩形的大小。我实际调用的方法是
-sizeWithFont:constrainedToSize:lineBreakMode:
。当调用
nil
时,此方法在设备上的返回结果与我传递的
CGSize
作为
constrainedToSize:
参数相同。正如我所说,我只是推测,但我的直觉是,在ARM架构上,方法的返回值通常与
constrainedToSize:
parameter.Gotcha放在相同的内存位置/寄存器中。嗯,我觉得这很合理。谢谢你的洞察力。那么我该如何解决这个问题呢?当我不传递它时,它返回不同的值
nil
也。。。