Как я могу изменить CGRect, сохраненный как NSValue в NSArray? - PullRequest
1 голос
/ 04 февраля 2010

Я создаю NSArray с CGRects, используя следующую строку:

[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 ]

5 голосов
/ 04 февраля 2010

Как уже упоминалось, экземпляры NSValue не являются изменяемыми, поэтому вам придется воссоздать их, а затем заменить их на NSMutableArray.

Другой вариант - использовать более «классическое» управление памятью C (malloc / free) и таким образом управлять вашим массивом. Нет ничего плохого в том, чтобы идти по этому пути. Вам просто нужно быть более осторожным, поскольку он не имеет такого высокого уровня, как API-интерфейсы Objective-C / Foundation.

// 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);

Может быть и быстрее, если вы работаете, например, над игрой.

5 голосов
/ 04 февраля 2010

NSValue объекты неизменны, поэтому вы ничего не можете сделать. Вы должны использовать изменяемый массив и заменить существующий объект новым экземпляром NSValue, содержащим новый прямоугольник.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...