Как я могу изменить CGRect, сохраненный как NSValue в NSArray?

StackOverflow https://stackoverflow.com/questions/2201321

  •  18-09-2019
  •  | 
  •  

Вопрос

Я создаю 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?, Что я могу сделать, чтобы значение действительно обновлялось в массиве?.Спасибо.

-Оскар

Это было полезно?

Решение

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

Другие советы

Как упоминали другие, 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);

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top