2013-02-16 35 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]; 

有沒有一種很好的方式將它應用到c數組 - 或者我只需要遍歷c數組?

+0

怎麼樣'[NSValue值:aPointArray withObjCType:@encode(MKMapPoint [12])]'或者類似的? – 2013-02-16 18:49:03

+0

@ H2CO3此方法在將來的版本中可能不推薦使用。您應該使用'valueWithBytes:objCType:'來代替。 – voromax 2013-02-16 18:54:21

+0

@voromax沒有檢查文檔,只是重複了OP的內容,但是是真的。 – 2013-02-16 18:56:06

回答

4

注意:這種方法只適用於數據不在具有不同「endianness」的處理器之間進行。從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; 
+0

這將很好地打破可移植性(memdumping'float's,呃......) – 2013-02-16 18:52:08

+0

是的,如果Apple開始使用非ARM芯片,那麼在大端和小端設備之間可能會出現問題。 – rmaddy 2013-02-16 18:56:15

+0

這種可移植性問題應該是一個問題,還是不太可能造成影響?另外你如何將它從'NSData'轉換回'MKMapPoint'數組? – Robert 2013-02-16 18:59:42

相關問題