截至目前(2014 年 9 月)NSInteger/CGFloat
,如果您还在为 arm64 构建应用程序,我建议您在与 iOS API 等交互时使用。这是因为当您使用float
,long
和int
类型时,您可能会得到意想不到的结果。
示例:FLOAT/DOUBLE 与 CGFLOAT
我们以 UITableView 委托方法为例tableView:heightForRowAtIndexPath:
。
在仅 32 位的应用程序中,如果这样编写,它将可以正常工作:
-(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 44;
}
float
是一个 32 位值,而您返回的 44 是一个 32 位值。但是,如果我们在 64 位 arm64 架构中编译/运行同一段代码,则 44 将是 64 位值。当预期为 32 位值时返回 64 位值将产生意外的行高。
您可以通过使用CGFloat
类型来解决此问题
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 44;
}
此类型表示 32float
位环境中的 32 位和 64 位double
环境中的 64 位。因此,当使用此类型时,无论编译/运行时环境如何,该方法都将始终接收预期的类型。
对于期望整数的方法也是如此。此类方法在 32 位环境中期望 32 位int
值,在 64 位环境中期望long
64 位。NSInteger
您可以通过使用用作int
基于long
编译/运行时环境的类型的类型来解决这种情况。