使用objectAtIndex Objective-C时的值错误

使用objectAtIndex Objective-C时的值错误,objective-c,indexing,nsarray,return-value,Objective C,Indexing,Nsarray,Return Value,我有一个数组,有两个元素,分别是50和60: NSArray*array = [NSArray arrayWithObjects: [NSNumber numberWithLong:50], [NSNumber numberWithLong:60], nil]; 当以后使用数组时,实际上我正在将此数组作为默认列表写入plist文件,我是这样做的: long value = [array objectAtIndex:1]; 之后,

我有一个数组,有两个元素,分别是50和60:

NSArray*array = [NSArray arrayWithObjects:
                [NSNumber numberWithLong:50],
                [NSNumber numberWithLong:60], nil];
当以后使用数组时,实际上我正在将此数组作为默认列表写入plist文件,我是这样做的:

long value = [array objectAtIndex:1];
之后,该值包含15559我不理解的内容。在调试器中[array objectAtIndex:1]清楚地显示long60

对不起,我看不出有什么不对

有什么想法吗


Ronald

这是因为您没有对从数组中获取的对象调用longValue:

long value = [[array objectAtIndex:1] longValue];

您的代码得到的是NSValue的地址,它被转换为与存储在数组中的数字无关的垃圾长值。

这是因为您没有对从数组中获得的对象调用longValue:

long value = [[array objectAtIndex:1] longValue];
代码得到的是NSValue的地址,它被转换为与存储在数组中的数字无关的垃圾长值。

长值不是NSValue。如果要将值设置为long到[array objectAtIndex:1],则必须将其从NSNumber转换为long。您可能希望通过NSN号码呼叫longValue来完成此操作

您可能想知道为什么编译器不抱怨并在这里帮助您。这可能是因为数组中的对象是作为id获取的,所以大多数赌注都是无效的。这是数组的一个常见问题:知道要获取什么以及如何使用它取决于您自己

调试器的屏幕截图非常出色。请注意,如果您现在头脑清醒,仔细观察它,就可以清楚地看到,一方面是长数值,另一方面是包含长数值的NSNumber数组[0]之间的差异。所以调试器实际上一直在回答你的问题

long不是一个NSNumber。如果要将值设置为long到[array objectAtIndex:1],则必须将其从NSNumber转换为long。您可能希望通过NSN号码呼叫longValue来完成此操作

您可能想知道为什么编译器不抱怨并在这里帮助您。这可能是因为数组中的对象是作为id获取的,所以大多数赌注都是无效的。这是数组的一个常见问题:知道要获取什么以及如何使用它取决于您自己


调试器的屏幕截图非常出色。请注意,如果您现在头脑清醒,仔细观察它,就可以清楚地看到,一方面是长数值,另一方面是包含长数值的NSNumber数组[0]之间的差异。所以调试器实际上一直在回答你的问题

此外,15559是0x3cc7—插槽1中NSNumber的地址。在64位OS X中,小数字实际上与其他一些信息一起直接存储在指针中,因此,50和60之间的差异是0xa00,即10*256,但这两者都不存在。例如,在iOS下,或者在32位OSX下,如果你要找到一台合适的旧机器,你不会看到同样的事情。我非常确定我必须做一些铸造。谢谢你的帮助,这不是演员阵容。这是关于包装和拆开包装的。NSN编号中有一个很长的编号。你把它和numberWithLong放在一起,所以你必须用longValue把它拿出来。我只是想扩展一下我之前的评论。强制转换与作为特定类型处理的值相同。如果显式强制转换,则指定将此值作为何种类型处理的是您。这与此无关;NSNumber和其中的long是两个不同的值。此外,15559是0x3cc7—插槽1中NSNumber的地址。在64位OS X中,小数字实际上与其他一些信息一起直接存储在指针中,因此,50和60之间的差异是0xa00,即10*256,但这两者都不存在。例如,在iOS下,或者在32位OSX下,如果你要找到一台合适的旧机器,你不会看到同样的事情。我非常确定我必须做一些铸造。谢谢你的帮助,这不是演员阵容。这是关于包装和拆开包装的。NSN编号中有一个很长的编号。你把它和numberWithLong放在一起,所以你必须用longValue把它拿出来。我只是想扩展一下我之前的评论。强制转换与作为特定类型处理的值相同。如果显式强制转换,则指定将此值作为何种类型处理的是您。这与此无关;NSNumber和其中的long是两个不同的值。使用现代Objective-C可以创建如下数组:NSArray*array=@[@50,@60];。这就简单多了,您可以得到如下值:long value=[array[1]longValue];只是想澄清一下,rmaddy的任何琐事都不会对当前局势产生任何影响。它们是纯粹的风格特征。使用现代Objective-C可以创建如下数组:NSArray*array=@[@50,@60];。这就简单多了,您可以得到如下值:long value=[array[1]longValue];只是想澄清一下,rmaddy的琐事对si没有任何影响 手边有一种激动。它们纯粹是风格特征。