Самый эффективный способ изменить значение CGPoint в массиве CGPoint?

Я построил массив CG Point следующим образом:

NSMutableArray *_startPositions = [NSMutableArray array];
[_startPositions addObject:[NSValue valueWithCGPoint:CGPointMake(0.0, 0.0)]];
[_startPositions addObject:[NSValue valueWithCGPoint:CGPointMake(0.0, 0.0)]];

Как я могу наиболее эффективно изменить значения x и y точек в массиве?

Если я получу значение с помощью:

CGPoint myPoint0 = [[_startPositions objectAtIndex:0] CGPointValue];

Я возвращаю копию пункта. Как я могу изменить значения x и y CGPoints в массиве? Я мог бы удалить CGPoint в любой позиции и заменить его на правильные значения x,y, но есть ли более эффективный способ?

3 ответа

Решение

Используйте массив C вместо NSMutableArray. При необходимости используйте классы коллекций C++ STL, такие как std::vector или другую библиотеку коллекций C/C++. Таким образом, вы можете манипулировать содержимым массива без вызова метода Obj-C.

Из документов:

NSValue объекты всегда неизменны.

Таким образом, ваш единственный вариант здесь, чтобы создать новый NSValue заменить старый, когда CGPoint значение меняется. Если вы ищете более эффективный способ хранения массива CGPointsтогда массив C является самым простым и быстрым способом.

Если вы меняете только значение "x" или "y" CGPoint point, ты можешь это сделать:

((CGPoint *)&point)->x += dx;

или

((CGPoint *)&point)->y += dy;

Я предлагаю вам создать свой собственный класс как

.час

@interface MyPoint : NSObject {
    CGPoint point;
}
@property (nonatomic,assign) CGPoint point;
@end

.m

@implementation MyPoint
@synthesize point;
@end

Затем добавьте свой MyPoint Объект в вашем массиве.
Измени это как

MyPoint *myPoint = [_startPositions objectAtIndex:0];
myPoint.point = myPoint0;
Другие вопросы по тегам