关于 NSUinteger 和 int 的问题

Questions about NSUinteger and int

我使用 JSONModel 从 json:

捕获数据
@interface BBTCampusBus : JSONModel

@property (strong, nonatomic) NSString * Name;
@property (assign, nonatomic) NSUInteger Latitude;
@property (assign, nonatomic) NSUInteger Longitude;
@property (nonatomic)         BOOL       Direction;
@property (assign, nonatomic) NSUInteger Time;
@property (nonatomic)         BOOL       Stop;
@property (strong, nonatomic) NSString * Station;
@property (assign, nonatomic) NSInteger  StationIndex;
@property (assign, nonatomic) NSUInteger Percent;
@property (nonatomic)         BOOL       Fly;

@end

我有以下代码:

for (int i = 0;i < [self.campusBusArray count];i++)
{
    NSLog(@"index at nsuinteger - %@", (NSUInteger)self.campusBusArray[i][@"StationIndex"]);
    NSLog(@"index - %lu", index);
    if ([(NSUInteger)self.campusBusArray[i][[@"StationIndex"] ]== index)
    {
        numberOfBusesCurrentlyAtThisStation++;
    }
}

其实StationIndex是一个1位或2位的整数。比如我有self.campusBusArray[i][@"StationIndex"] == 4,我有index == 4,那么两个NSLog都输出4,但是不会跳转到if块,或者numberOfBusesCurrentlyAtThisStation++不会被执行。有人可以告诉我为什么吗?

让我们看一下这行:

NSLog(@"index at nsuinteger - %@", (NSUInteger)self.campusBusArray[i][@"StationIndex"]);

%@表示一个对象将被包含在日志中,一个实现description的对象。这很好,因为表达式的末尾取消引用了一个可能只包含对象的字典。

NSUInteger,就像 int 是一个 scalar 类型。和老式的C一样,它只是内存中的一组字节,其值就是这些字节的数值。一个对象,即使是代表数字的对象,比如 NSNumber 也不能使用 c 风格的强制转换(而且强制转换的优先级很低,这个表达式真的只是强制转换 self,也是无意义的) .

所以看起来self.campusBusArray是一个字典数组(可能是解析JSON描述对象数组的结果)。看起来您希望这些词典有一个名为 [@"StationIndex"] 的键和一个数值。根据 objective-c 集合(它们包含对象)的规则, 必须 是一个 NSNumber。因此:

NSDictionary *aCampusBusObject = self.campusBusArray[i];     // notice no cast
NSNumber *stationIndex = aCampusBusObject[@"StationIndex"];  // this is an object
NSUInteger stationIndexAsInteger = [stationIndex intValue];  // this is a simple, scalar integer

if (stationIndexAsInteger == 4) {  // this makes sense
}

if (stationIndex == 4) {  // this makes no sense
}

最后一行测试 指向对象的指针 (内存中的地址)是否等于 4。进行标量数学运算、强制转换或比较对象指针几乎没有意义。

重写...

for (int i = 0;i < [self.campusBusArray count];i++)
{
    NSDictionary *aCampusBusObject = self.campusBusArray[i];
    NSNumber *stationIndex = aCampusBusObject[@"StationIndex"];
    NSUInteger stationIndexAsInteger = [stationIndex intValue];

    NSLog(@"index at nsuinteger - %lu", stationIndexAsInteger);
    NSLog(@"index - %lu", index);
    if (stationIndexAsInteger == index)
    {
        numberOfBusesCurrentlyAtThisStation++;
    }
}