iPhone - 阻止枚举

时间:2011-02-23 22:49:48

标签: iphone cocoa-touch objective-c-blocks

我有一个包含多个对象的数组,我想为每个值添加90.0。 我想使用枚举来执行此操作。然后我创建此:

[myArray enumerateObjectsWithOptions:NSEnumerationConcurrent
     usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

     double aValue = [obj doubleValue];                      
     aValue += 90.0;
     obj = [NSNumber numberWithDouble:aValue];
}];

我的问题是关于最后一行。我得到对象值,添加90然后我必须将它存回。因为这有点奇怪,因为我正在处理对象级别,我不确定第三行是否具有正确的语法来将更新的值存储回对象。 Xcode抱怨“obj”从未使用过,因为它认为我将数字分配给obj并打算使用它,但我只是将值存回。

这是对的吗?

3 个答案:

答案 0 :(得分:2)

obj不是引用或指针,您实际上无法将其存储回来。 NSArray不支持此功能。你可以做的不是存储NSNumbers,而是存储指向NSNumber(即NSNumber **)的指针,并更新对新对象的引用。

将您的号码存储在普通double[]数组中也可以。

答案 1 :(得分:1)

更好的方法是将修改后的值存储到新数组中:

NSMutableArray *newArray = [[NSMutableArray alloc] initWithCapacity:[myArray count]];
__block newArray;
[myArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

 double aValue = [obj doubleValue];                      
 aValue += 90.0;
 [newArray insertObject:[NSNumber numberWithDouble:aValue] atIndex:idx];
}];

note 我直接输入了这个,所以请原谅任何语法错误。

答案 2 :(得分:0)

如果您想进行就地操作,可以使用:

[myArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id obj, NSUInteger idx, BOOL *stop) 
{
    double aValue = [obj doubleValue];                      
    aValue += 90.0;
    [myArray replaceObjectAtIndex:idx withObject:[NSNumber numberWithDouble:aValue]];
}];

虽然NSMutableArray不应该是线程安全的,但通常只有在你改变它的大小时才会这样。在简单的测试中工作得很好,但使用风险自负。