Создайте массив CGPoints большого размера в target-c - PullRequest
5 голосов
/ 10 марта 2010

Я пытаюсь создать массив CGPoints увеличенного размера в target-c.Я рассмотрел использование NSMutableArray, однако он не позволяет изменить размер.Могу ли я использовать что-то еще?

спасибо

Ответы [ 2 ]

21 голосов
/ 10 марта 2010

Используйте NSMutableArray, но просто поместите ваши CGPoint структуры в NSValue объекты. Пример:

CGPoint myPoint = {0,0};
CGPoint anotherPoint = {42, 69};

NSMutableArray * array = [NSMutableArray array];
[array addObject:[NSValue valueWithCGPoint:myPoint]];
[array addObject:[NSValue valueWithCGPoint:anotherPoint]];

CGPoint retrievedPoint = [[array objectAtIndex:0] CGPointValue];

Обратите внимание, что методы +valueWithCGPoint: и CGPointValue доступны только на iPhone. Однако, если вам это нужно для Mac, существуют аналогичные методы для работы с NSPoint s, и тривиально преобразовать CGPoint в NSPoint (вы можете использовать NSPointFromCGPoint()).

2 голосов
/ 10 марта 2010

NSMutableArray для объектов. Для простых старых типов данных используйте NSMutableData и старые добрые типы указателей. Это неструктурированный буфер памяти с изменяемым размером, как раз то, что вам нужно для вектора POD. Что касается безопасности статического типа, Objective C все равно не дает вам ничего подобного.

EDIT:

Создание изменяемого объекта данных с начальным размером n структур CGPoint:

NSMutableData *Data = [NSMutableData dataWithLength: n*sizeof(CGPoint)];

Помещение CGPoint pt в буфер в i-й позиции:

CGPoint pt;
NSRange r = {i*sizeof(CGPoint), sizeof(CGPoint)};
[Data replaceBytesInRange: r withBytes:&pt];

Извлечение CGPoint из i-й позиции в pt:

CGPoint pt;
NSRange r = {i*sizeof(CGPoint), sizeof(CGPoint)};
[Data getBytes: &pt range:r];

Увеличение массива на n объектов:

[Data increaseLengthBy:n*sizeof(CGPoint)];

Надеюсь, что это покрывает. См. Ссылку NSMutableData и помните, что все методы NSData применимы к нему.

...