Как использовать NSCoding для c-массива структур? (MKPolyline)

Я хочу добавить поддержку NSCoding в массив структур c. В частности, это для подкласса MKPolyline < / a>, т.е. вот с чем мне приходится работать:

@property (nonatomic, readonly) MKMapPoint *points;
@property (nonatomic, readonly) NSUInteger pointCount;

+ (MKPolyline *)polylineWithPoints:(MKMapPoint *)points count:(NSUInteger)count;

Я нашел хороший ответ о том, как кодировать индивидуальную структуру. Например.

NSValue* point = [NSValue value:&aPoint withObjCType:@encode(MKMapPoint)];
[aCoder encodeObject:point forKey:@"point"];

.... 

NSValue* point = [aDecoder decodeObjectForKey:@"point"];
[endCoordinateValue getValue:&aPoint];

Есть ли хороший способ применить это к c-массиву - или мне просто придется перебирать c-массив?


person Robert    schedule 16.02.2013    source источник
comment
Как насчет [NSValue value:aPointArray withObjCType:@encode(MKMapPoint[12])] или подобного?   -  person    schedule 16.02.2013
comment
@ H2CO3 Этот метод может быть объявлен устаревшим в будущих версиях. Вместо этого вы должны использовать valueWithBytes:objCType:.   -  person voromax    schedule 16.02.2013
comment
@voromax Не проверял документы, просто повторил то, что было у OP, но это правда.   -  person    schedule 16.02.2013


Ответы (1)


Примечание. Этот подход работает только в том случае, если данные не передаются между процессорами с разным порядком байтов. Переход с iOS на iOS должен быть безопасным, особенно если он используется только на данном устройстве.

Вы должны иметь возможность загрузить память для C-массива в объект NSData, а затем закодировать объект NSData.

MKMapPoint *points = self.points;
NSData *pointData = [NSData dataWithBytes:points length:self.pointCount * sizeof(MKMapPoint)];
[aCoder encodeObject:pointData forKey:@"points"];

Обновление: чтобы вернуть данные:

NSData *pointData = [aCode decodeObjectForKey:@"points"];
MKMapPoint *points = malloc(pointData.length);
memcpy([pointData bytes], points);
self.points = points;
person rmaddy    schedule 16.02.2013
comment
И это здорово нарушит переносимость (memdumping floats, ага ...) - person ; 16.02.2013
comment
Да, если Apple начнет использовать чипы без ARM, может возникнуть проблема при переходе между устройствами с прямым порядком байтов и обратным порядком байтов. - person rmaddy; 16.02.2013
comment
Должны ли проблемы с переносимостью вызывать беспокойство или они вряд ли окажут влияние? Также как бы вы преобразовали его обратно из NSData в массив MKMapPoint? - person Robert; 16.02.2013
comment
Я снова немного застрял ... Я задал новый вопрос. stackoverflow.com/q/14914265/296446 - person Robert; 16.02.2013
comment
По какой-то причине это не сработало для меня, и это также дало мне предупреждение об отправке параметра const void * to void *. Я исправил это, используя следующее: [pointData getBytes: & points length: pointsSize]; - person davvilla; 23.05.2014