gpt4 book ai didi

c++ - 使用 C++ 实例变量归档/序列化 Objective-C 对象

转载 作者:太空宇宙 更新时间:2023-11-03 21:57:14 25 4
gpt4 key购买 nike

我在 Objective-C 中使用 OpenCV 静态库进行一些图像处理,虽然我的应用程序运行良好,但在设备本身上却相当慢。大部分处理实际上可以事先完成,所以我决定将这些数据序列化并在应用程序启动时加载它。

我需要序列化/存档的数据位于 CvSeq 类型的对象中(openCV 序列 - 指向值序列的指针)。我基本上想将其保存到文件中,以便稍后加载。我想我可以通过制作一个遵守 NSCoding 协议(protocol)并从那里编码/解码的类来做到这一点:

@implementation MyObject

@synthesize point = _point;
@synthesize description = _description;

- (id)initWithCoder:(NSCoder *)decoder {
if (self = [super init]) {
self.point = [decoder decodeObjectForKey:@"point"];
self.description = [decoder decodeObjectForKey:@"description"];
}
return self;
}

- (void)encodeWithCoder:(NSCoder *)encoder {
[encoder encodeObject:self.point forKey:@"point"];
[encoder encodeObject:self.description forKey:@"description"];
}

@end

但是在 decodeObjectForKey: 和 encodeObject: 调用中我得到了错误

error: cannot convert 'objc_object*' to 'CvSeq*' in argument passing

我的代码是否有问题,或者我是否需要采取另一条途径才能在我的对象中使用非 objective-C 实例变量来实现同样的事情?

最佳答案

Objective-C 的序列化代码不会知道如何归档您的 C++ 类。您将需要显式编写代码来执行此操作。假设“描述”是上面代码中的 CvSeq*,您将需要编写将 CvSeq 转换为 Cocoa 知道如何归档的内容的方法。 NSString 可能是最容易开始的地方,即使它不是最有效的方案。

NSString* NSStringFromCvSeq(CvSeq* cppObj)
{
// You have to write this, but at it's simplest it might be something like...
return [NSString stringWithFormat: @"%d|%d|%d", cppObj->foo, cppObj->bar, cppObj->baz];
}

CvSeq* NewCvSeqFromNSString(NSString* encodedString)
{
// You have to write this, but at it's simplest it might be something like...
NSScanner* scanner = [NSScanner scannerWithString: encodedString];
[scanner setCharactersToBeSkipped:[NSCharacterSet characterSetWithCharactersInString: @"|"]];
int foo = [scanner scanInt];
int bar = [scanner scanInt];
int baz = [scanner scanInt];

return new CvSeq(foo, bar, baz);
}

- (id)initWithCoder:(NSCoder *)decoder {
if (self = [super init]) {
self.point = [decoder decodeObjectForKey:@"point"];
self.description = NewCvSeqFromNSString([decoder decodeObjectForKey:@"description"]);
}
return self;
}

- (void)encodeWithCoder:(NSCoder *)encoder {
[encoder encodeObject:self.point forKey:@"point"];
[encoder encodeObject: NSStringFromCvSeq(self.description) forKey:@"description"];
}

这里的关键是 Cocoa 不知道如何存档任意类型(除了已经采用 NSCoding 的 Objective-C 类型),并且永远不会在没有某种粘合层的情况下“免费”存档 C++ 对象,因为C++对象无法采用NSCoding协议(protocol)。

希望对您有所帮助!

关于c++ - 使用 C++ 实例变量归档/序列化 Objective-C 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5637787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com