leo*_*ato 5 c iphone cocoa serialization objective-c
我需要为Objective-C Trie实现(github上的NDTrie)添加某种归档功能,但我对C及其数据结构的经验很少.
struct trieNode
{
NSUInteger key;
NSUInteger count,
size;
id object;
__strong struct trieNode ** children;
__strong struct trieNode * parent;
};
@interface NDTrie (Private)
- (struct trieNode*)root;
@end
Run Code Online (Sandbox Code Playgroud)
我需要的是NSData从该根创建一个树结构 - 或者以其他方式序列化/反序列化整个树(符合NSCoding?),但我不知道如何使用NSData和包含指针的C结构.
反序列化生成的对象的性能至关重要,因为这是一个iPhone项目,每次应用程序启动时我都需要在后台加载它.
实现这一目标的最佳方法是什么?
谢谢!
小智 1
假设您需要坚持使用直接 C,因为这就是已经设置的方式,那么您需要做的实际上非常简单。
只需编写一个 C 函数将树写到磁盘,并进行一些有关顺序的假设(例如,您首先从左到右将其写入深度)。对于任何 Objective-C 对象,将它们编码到 NSData 中,并将它们的大小和字节写出作为流的一部分。
当您读回数据时,只需根据您的排序假设重建树,并设置指向子项的指针。根据需要取消归档任何嵌入的 Objective-C 对象。
您可能可以使用 NSCoder 以某种方式完成此操作,但在其之外进行树重建可能会更容易,因为您可以递归地传递树并传递您喜欢的任何参数,这对于 NSCoding 来说并不是很容易。
我确实有一些(Desktop OS X)代码可以执行与此非常相似的操作,但没有嵌入对象,但它非常繁琐,我无法发布它。
该代码中的一项优化是将数据以 MB 块的形式读入内部缓冲区(而不是针对每个结构一次读取少量字节),然后从该缓冲区读取数据,尽管我不这样做确保曾经进行过基准测试,并且在任何情况下它可能会也可能不会对 iPhone 产生重大影响。看起来对于写入也有类似的优化,据我了解,这更有可能是一个胜利(iPhone 写入很昂贵,或者我听说过)。