用整数和一个初始化一个NSMutableArray某种不需要的类型转换

时间:2012-04-04 00:50:32

标签: objective-c nsmutablearray

我想用8个整数初始化一个NSMutableArray。我在SO档案中找到的东西让我感到震惊,但似乎确实有效:

_noClicks = [[NSMutableArray alloc] initWithObjects:[NSNumber numberWithUnsignedInteger:1], [NSNumber numberWithUnsignedInteger:1], [NSNumber numberWithUnsignedInteger:1], [NSNumber numberWithUnsignedInteger:1], [NSNumber numberWithUnsignedInteger:1], [NSNumber numberWithUnsignedInteger:1], [NSNumber numberWithUnsignedInteger:1], [NSNumber numberWithUnsignedInteger:1], [NSNumber numberWithUnsignedInteger:1],nil];

我知道Objective-c不是一门面向科学的语言,但必须有一种更好的方法(我猜这是问题1)。顺便说一下,这个代码在一个名为GameData的单例的init方法中,并放在一个包含其他数组的字典中。

稍后,我使用这个整数数组如下:

- (IBAction)buttonOneWasTouched:(id)sender {

    NSUInteger CAP = [[GameData gameData] getCurAnsPos];
    NSLog(@"%i", CAP); // CAP is current answer position and this seems to work
    NSMutableArray *noClks = [[GameData gameData].curData valueForKey:@"noClicks"];
    NSLog(@"%@", noClks); // gives the expected array of 1's
    NSLog(@"%@", [noClks class]); // _NSArrayM OK I think
    NSUInteger nC = [noClks objectAtIndex:CAP];
    NSLog(@"%i", nC); // This gives a crazy answer: 109613120
}

这里出了点问题;为nC记录的巨大数字告诉我它已经存储为无符号整数以外的其他数字,但我不明白为什么。所以这是问题#2。

最后,这可能是线索,编译器在第2行到最后一行给出了警告Incompatible pointer to integer conversion initializing 'NSUInteger' (aka 'unsigned int') with an expression of type 'id';,但奇怪的是,第1行具有相同的结构,但没有给出错误。这一定是非常简单的事情,我最近的所有问题都是如此。 TIA!

1 个答案:

答案 0 :(得分:1)

对于第一个问题,我建议像

_noClicks = [[NSMutableArray alloc] initWithCapacity:n];

for(int i=0;i<n;i++)
    [_noClicks addObject:[NSNumber numberWithInt:1]];

如方法名称所示,objectAtIndex返回一个对象,而不是NSUInteger。您可以执行类似

的操作
NSNumber *nC = [noClks objectAtIndex:CAP];

NSUInteger nC = [[noClks objectAtIndex:CAP] intValue];