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
也。。。