Как я могу изменить CGRect, сохраненный как NSValue в NSArray?
Вопрос
Я создаю 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);
Это тоже может быть быстрее, если вы работаете, например, над игрой.