将NSNumber转换为NSInteger

18

我试图确定数组中的一个值并对该数组进行更改,但我一开始就无法访问该数组...

NSNumber *row = [NSNumber numberWithInt:recognizer.view.tag];
    NSInteger *newRow = [row integerValue];
    NSInteger *index = [selectedItems indexOfObject:row];//0=Not selected 1=selected;
    NSLog(@"%@ & ",row);
    if (index == 0) {
        [selectedItems removeObjectAtIndex:newRow];
        [selectedItems insertObject:@"1" atIndex: newRow];
        [(UITableViewCell *)(recognizer.view) setAccessoryType:UITableViewCellAccessoryCheckmark];
    } else {
        [selectedItems removeObjectAtIndex: newRow];
        [selectedItems insertObject:@"0" atIndex: newRow];;
        [(UITableViewCell *)(recognizer.view) setAccessoryType:UITableViewCellAccessoryNone];
    }

你可以看到我正在尝试从变量 `row` 中获取信息,该变量是一个 NSNumber,并查找具有索引变量的数组的值。 我也在我的 onload() 函数中声明了这个变量...

selectedItems = [NSArray arrayWithObjects: 0, 0, 0, nil];

问题是我一直收到这些警告信息说...

Incompatible integer to pointer conversion initializing 'NSInteger *' (aka 'int *') with an expression of type 'NSUInteger' (aka 'unsigned int'); 
无论何时我使用变量row或newRow。如您所见,newRow只是row作为整数。我做错了什么?
2个回答

57

NSInteger只是int的一个别名,因此它不是对象类型,而是标量类型,您不必将其声明为指针类型。使用即可。

NSInteger newRow = [row integerValue];

改用


1
只是想补充一下,即使NSInteger只是int的typedef,它比int更有用,因为它可以自己适应32位/64位架构。 - jmstone617
1
如果我删除newRow和index的指针,就不会收到警告,但是当我运行我的应用程序时,运行此代码时会出现错误... NSLog(@“%@和%@”,newRow,index); 错误是EXC_BAD_ACCESS。 - The Man
1
最好将其视为 long 的 typedef(即使它不是)。它的大小取决于目标架构。 - Jonathan Grynspan
@Joe Burnett - 是的,因为%@是用于对象的。请使用%d代替。@Jonathan Grynspan:你说得对。 - user529758

2

NSInteger是一种原始类型,不是对象类型。集合(例如数组)只能包含对象,例如NSNumber。

您可以使用诸如-integerValue之类的方法从NSNumber中获取原始值。请注意,通常不要创建NSInteger指针(NSInteger*),而只需要一个NSInteger。

另外,没有必要从recognizer.view.tag获取NSNumber,然后在该NSNumber上调用-integerValue。直接使用recognizer.view.tag作为整数值即可。(仍然可以将其分配给本地变量以进行快速访问。)


在NSLog调用中,“%@”格式说明符期望其参数为对象指针。要记录整数,请使用“%d”。 - Ken Thomases

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接