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

时间:2010-02-04 16:30:57

标签: iphone nsarray

我正在使用以下行创建一个带有CGRects的NSArray:

[self setMyArray:[NSArray arrayWithObjects:[NSValue valueWithCGRect:CGRectMake(x,y,z,a)], [NSValue valueWithCGRect:CGRectMake(x,y,z,a)], nil]]

然后我经常尝试更新数组中的CGrects:

for (NSValue *bound in myArray)
  {
   CGRect myRect = [bound CGRectValue];
   myRect.origin.y += 2;
  }

然而这不起作用,当循环再次运行时,原点仍然相同。我假设这与NSValue包装器有关?,我该怎么做才能在数组中实际更新该值?谢谢。

-Oscar

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:5)

正如其他人所提到的,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);

如果你在比赛中工作,也可能更快。