2013-02-16 3 views
2

Я хочу добавить поддержку NSCoding в массив c структур. В частности, это для подкласса MKPolyline, то есть это то, что я должен работать с:Как использовать NSCoding для c-массива структур? (MKPolyline)

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

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

I found a good answer on how to encode a individual struct. Например.

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

.... 

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

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

+0

Как насчет '[значение NSValue: aPointArray withObjCType: @encode (MKMapPoint [12])]' или подобное? – 2013-02-16 18:49:03

+0

@ H2CO3 Этот метод может быть устаревшим в будущей версии. Вместо этого вы должны использовать 'valueWithBytes: objCType:'. – voromax

+0

@voromax Не проверял документы, просто повторил то, что имел OP, но это правда. – 2013-02-16 18:56:06

ответ

4

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

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

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

Update: чтобы получить данные обратно:

NSData *pointData = [aCode decodeObjectForKey:@"points"]; 
MKMapPoint *points = malloc(pointData.length); 
memcpy([pointData bytes], points); 
self.points = points; 
+0

И это будет приятно нарушать переносимость (memdumping 'float's, ehh ...) – 2013-02-16 18:52:08

+0

Да, если Apple начнет использовать чипы, отличные от ARM, может возникнуть проблема, возникающая между устройствами с большим и низким порядком. – rmaddy

+0

Должны ли возникать проблемы с переносимостью, или это вряд ли вызовет удар? Также как вы можете преобразовать его из 'NSData' в массив' MKMapPoint'? – Robert

 Смежные вопросы

  • Нет связанных вопросов^_^