Iphone 如何修改存储为NSArray中NSValue的CGRect?

Iphone 如何修改存储为NSArray中NSValue的CGRect?,iphone,nsarray,Iphone,Nsarray,我正在使用以下行创建带有CGRECT的NSArray: [self setMyArray:[NSArray arrayWithObjects:[NSValue valueWithCGRect:CGRectMake(x,y,z,a)], [NSValue valueWithCGRect:CGRectMake(x,y,z,a)], nil]] 然后,我尝试每隔一段时间更新数组中的CGRECT,如下所示: for (NSValue *bound in myArray) { CGRect m

我正在使用以下行创建带有CGRECT的NSArray:

[self setMyArray:[NSArray arrayWithObjects:[NSValue valueWithCGRect:CGRectMake(x,y,z,a)], [NSValue valueWithCGRect:CGRectMake(x,y,z,a)], nil]]
然后,我尝试每隔一段时间更新数组中的CGRECT,如下所示:

for (NSValue *bound in myArray)
  {
   CGRect myRect = [bound CGRectValue];
   myRect.origin.y += 2;
  }
但是这不起作用,当循环再次运行时,原点仍然相同。我假设这与NSValue包装器有关,那么如何才能使值在数组中实际更新呢?。多谢各位


-Oscar

NSValue对象是不可变的,因此您无能为力。您应该使用可变数组,并用包含新rect的新NSValue实例替换现有对象。

NSValue对象是不可变的,因此您无能为力。您应该使用可变数组,并使用包含新rect的新NSValue实例替换现有对象。

正如其他人提到的,
NSValue
实例是不可变的,因此您必须重新创建它们,然后在
NSMutableArray
中替换它们

另一种选择是使用更“经典”的C内存管理(malloc/free)并以这种方式管理阵列。走那条路没有什么错。您只需要更加小心,因为它不像Objective-C/Foundation API那样具有高级别

// Create an array to hold 100 rectangles
CGRect* rectangles = (CGRect*) malloc(100 * sizeof(CGRect));

// Change the rectangle at index 2 (remember arrays are 0 based, so this is the 3rd)
CGRect* rect = &rectangles[2];
rect->size.width /= 2.0;

// Shortcut for accessing rectangles
rectangles[2].size.width = 100.0;

// Get rid of the array
free(rectangles);

如果您处理例如游戏,可能也会更快。

如其他人所述,
NSValue
实例是不可变的,因此您必须重新创建它们,然后在
NSMutableArray
中替换它们

另一种选择是使用更“经典”的C内存管理(malloc/free)并以这种方式管理阵列。走那条路没有什么错。您只需要更加小心,因为它不像Objective-C/Foundation API那样具有高级别

// Create an array to hold 100 rectangles
CGRect* rectangles = (CGRect*) malloc(100 * sizeof(CGRect));

// Change the rectangle at index 2 (remember arrays are 0 based, so this is the 3rd)
CGRect* rect = &rectangles[2];
rect->size.width /= 2.0;

// Shortcut for accessing rectangles
rectangles[2].size.width = 100.0;

// Get rid of the array
free(rectangles);

例如,如果你在游戏中工作,可能也会更快。

我想我必须这样做,尽管如果我经常删除和替换NSMutableArray中的对象,会有很大的开销吗?这可能是每.02秒一次。替换可变数组中的对象应该非常快,因为这只是移动指针的问题。分配新的NSValue实例可能会对性能造成更大的影响,但我不担心这一点。每秒50次分配实际上并不多。在确定代码是瓶颈之前,您不应该尝试优化代码。我想我必须这样做,尽管如果我经常删除和替换NSMutableArray中的对象,会有很多开销吗?,在可变数组中替换一个对象应该非常快,因为这仅仅是移动指针的问题。分配新的NSValue实例可能会对性能造成更大的影响,但我不担心这一点。每秒50次分配实际上并不多。在确定代码是瓶颈之前,您不应该尝试优化代码。谢谢,我将尝试此选项,是的,我正在制作游戏。谢谢,我将尝试此选项,是的,我正在制作游戏。