0

我正在尝试(在 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];
}
4

3 回答 3

3

你对指针的使用都是靠不住的。id*应该只是id而且NSUInteger*应该只是NSUInteger——你不想要指向对象的指针或指向整数的指针。

于 2014-02-21T05:05:10.627 回答
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];
}
于 2014-02-21T05:12:45.110 回答
-1

在下面的声明中

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。一种解决方案是使用临时变量,然后复制回结果。

于 2014-02-21T04:58:52.933 回答