0

我将 NSSegmentedControl 设置为发送者,当用户单击对象中的每个按钮时添加功能。下面的片段对我来说总是很好。它仍然存在,但是当我使用 64 位架构构建时收到以下警告。当我恢复到 32 位时,警告就会消失。有人可以告诉我如何编辑代码吗?谢谢您的帮助。-保罗。

“隐式转换失去整数精度:NSInteger(又名long)到“int”

int selectedSegment = [arSegController selectedSegment];
int clickedSegmentTag = [[arSegController cell] tagForSegment:selectedSegment];

if (clickedSegmentTag == 0) {
4

4 回答 4

1

NSInteger 只不过是一个 typedef'd long。您应该使用 NSInteger 但如果由于某种原因您需要使用 int 然后尝试类型转换。

int selectedSegment = (int)[arSegController selectedSegment];
于 2012-08-14T15:16:02.150 回答
1

64位指南

我相信您正在将一个 8 字节长的 long 变量分配给一个 4 字节长的 int。我认为在 mac 中他们使用 LP64,这意味着 long 和指针获得 8 个字节。声明 selectedSegment NSInteger 也应该解决这个问题。在 32 位机器上,长度为 32 位,而在 64 位机器上,长度为 64 位。

NSInteger selectedSegment = [arSegController selectedSegment]; 
NSInteger clickedSegmentTag = [[arSegController cell] tagForSegment:selectedSegment]; 

if (clickedSegmentTag == 0) { 
于 2012-08-14T15:20:24.507 回答
1

您需要使用NSInteger而不是int您的变量。您可以只查看 中的声明NSSegmentedControl.h,但最好阅读 Apple 的64-Bit Transition Guide for Cocoa

于 2012-08-14T15:13:13.157 回答
0

NSInteger 似乎在 64 位平台上被定义为 long(因此在 32 位 OS X 和 iOS 上,您不会收到此警告)。此外,在这些平台上,long 是 64 位长,而 int 只是 32 位 - 所以,正如编译器告诉你的那样,你会失去精度。数字 >= 2 ^ 32 不能用 32 位表示,因此对于这些数字,您可能会遇到一些奇怪的行为(与数字被截断有关)。

解决方案:将方法的返回值显式转换为(int).

于 2012-08-14T15:20:53.247 回答