int 或 NSInteger 到 NSUInteger 用于索引

Posted

技术标签:

【中文标题】int 或 NSInteger 到 NSUInteger 用于索引【英文标题】:int or NSInteger to NSUInteger for index 【发布时间】:2014-02-21 04:52:40 【问题描述】:

我正在尝试(在 Xcode5 中)将“removeObjectAtIndex”用于“MutableArray”,它需要一个 NSUInteger,但我使用的变量是一个整数,所以我使用 (NSUInteger *) 进行了转换,但我收到一个警告表示从较小的整数类型转换为 'NSUInteger *'(又名 unsigned long *)。我没有在代码中使用变量“second”来保持警告,但它也是一个整数

-(void) moveObjectAtIndex:(NSUInteger *)oldIndex toNewIndex:(NSUInteger *)newIndex
    id *member = [self.array objectAtIndex:*oldIndex];
    [self.array removeObjectAtIndex:*oldIndex];
    if ((NSInteger)newIndex >=(self.array.count)) 
        newIndex--; //i casted newIndex because I got a warning about ordered comparison of NSUInteger with NSInteger (I'm not sure if this is best solution)
    
    [self.array insertObject:member atIndex: *newIndex];


-(void)moveObjectInArray:(NSMutableArray *)array
    [array moveObjectAtIndex:(NSUInteger *) first toNewIndex:second];

【问题讨论】:

为什么是星号/指针?为什么不直接将这些整数作为参数传递(并直接检索它们)?您不太可能混淆自己,并且您没有使用指针作为指针任何事情(据我所知)。 您和@Chuck 关于指针和星号所说的完全正确。我提出了这里每个人都说的建议,并解决了问题。谢谢 【参考方案1】:

您对指针的使用完全靠不住。 id* 应该只是 idNSUInteger* 应该只是 NSUInteger - 你不想要指向对象的指针或指向整数的指针。

【讨论】:

【参考方案2】:

只使用 NSUInteger 而不是 NSUInteger* 对您有什么问题?

-(void) moveObjectAtIndex:(NSUInteger)oldIndex toNewIndex:(NSUInteger)newIndex
    id member = [self.array objectAtIndex:oldIndex]; //Here is id, id* is wrong
    [self.array removeObjectAtIndex:oldIndex];
    newIndex = newIndex >= self.array.count ? : self.array.count - 1; // Here should be self.array.count - 1, not newIndex-1
    newIndex = MIN(_cloudListArray.count, newIndex);
    [self.array insertObject:member atIndex:newIndex];

【讨论】:

【参考方案3】:

在下面的语句中

if ((NSInteger)newIndex >=(self.array.count))

您正在将指针类型转换为 NSInteger。应该是

if ((NSInteger)*newIndex >=(self.array.count))

不过,您仍应小心类型转换,并警惕任何有符号/无符号转换或数据丢失造成的后果。

还有,在这一行

[array moveObjectAtIndex:(NSUInteger *) first toNewIndex:second];

first 的类型应为NSUInteger * 或相同大小。请注意,long 在 64 位环境中是 64 位的,将较小的指针类型转换为较大的指针类型将产生未定义的行为。同样适用于second。一种解决方案是使用临时变量,然后将结果复制回来。

【讨论】:

你能给我一个如何使用临时变量的例子吗?如果我让 NSUInteger *random = first 应用相同的警告并且我不能使用 id 类型的变量。

以上是关于int 或 NSInteger 到 NSUInteger 用于索引的主要内容,如果未能解决你的问题,请参考以下文章

不兼容的整数到指针的转换将“NSInteger”(又名“int”)发送到“NSInteger *”(又名“int *”)类型的参数

编码一个 int 或 NSInteger 用于状态恢复

从'NSInteger'(又名'int')分配给'NSString *'的不兼容整数到指针转换;

不兼容的指针类型将“NSString *”发送到“NSInteger *”类型的参数(又名“int *”)

C中的int和OC中的NSInteger区别

NSUInteger vs NSInteger,int vs unsigned,以及类似情况