iPhone-块枚举

iPhone-块枚举,iphone,cocoa-touch,objective-c-blocks,Iphone,Cocoa Touch,Objective C Blocks,我有一个包含多个对象的数组,我想为每个值添加90.0我想使用enumerate执行此操作。然后我创建此: [myArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id obj, NSUInteger idx, BOOL *stop) { double aValue = [obj doubleValue]; aValue += 90

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

[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是为了使用它,但我只是将值存储回去


这是否正确?

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


将数字存储在普通的
double[]
数组中也可以使用。

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

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];
}];

注意:我直接输入了这个,因此请原谅任何语法错误。

如果您想执行就地操作,可以使用以下方法:

[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不应该是线程安全的,但通常只有在更改其大小时才应该是线程安全的。在一个简单的测试中效果很好,但使用风险自负。

您只能枚举对象。double不是一个对象。NSNumber是。我不是说他可以通过常规的enumerate*消息对它们进行枚举,我只是说当元素在数组中时,更新每个元素会更容易。我以前做过,但我收到一个错误,说我无法更改正在枚举的数组…:(