Cocoa NSInteger在64位架构中构建时

时间:2012-08-14 15:10:09

标签: cocoa nsinteger

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

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

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

if (clickedSegmentTag == 0) {

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

int selectedSegment = (int)[arSegController selectedSegment];

答案 2 :(得分:1)

64 bit guide

我相信你将一个8字节长的长变量分配给一个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) { 

答案 3 :(得分:0)

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

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