int或NSInteger到NSUInteger索引

时间:2014-02-21 04:52:41

标签: objective-c nsuinteger

我正在尝试(在Xcode5中)使用'removeObjectAtIndex'作为'MutableArray',它接受一个NSUInteger,但我正在使用的变量是一个整数,所以我使用了(NSUInteger *),但我得到一个警告:从较小的整数类型转换为'NSUInteger *'(aka 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];
}

3 个答案:

答案 0 :(得分:3)

你对指针的使用都很不稳定。 id*应该只是idNSUInteger*应该只是NSUInteger - 您不希望指向指向对象的指针或指向整数的指针。< / p>

答案 1 :(得分: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];
}

答案 2 :(得分:-1)

在以下声明中

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

你是指向NSInteger的指针。它应该是

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

但是,您应该小心进行类型转换,并对由于任何签名/未签名转换或数据丢失而产生的后果保持警惕。

另外,在这一行

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

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