好的,首先,我必须承认这是我第一次使用C ++。随着清除,我想继续。问题很简单,但有一些(奇怪的)扭曲。我试图将C ++库包装成Objective-C代码。假设名为“my_class”的C ++类有一个方法“get_string”,它返回另一个类“my_second_class”,它有一个名为“my_string”的方法,它返回一个std :: string,我想将它放入一个属性NSString我的Obj-C类“MyClass”命名为“MyNSString”。
这是代码。我已经跳过了includes / imports和'using namespace'部分。它们存在。
MyClass.h
@interface Torrent : NSObject {
my_class myCls;
@property NSString *MyNSString;
- (instancetype)initWithHandle:(void*)handle;
- (void)setInfo;
@end
MyClass.m
@implementation MyClass
@synthesize MyNSString;
- (instancetype)initWithHandle:(void*)handle {
self = [super init];
if (self) {
myCls = static_cast<my_class*>(handle);
if (! myCls->is_valid()) return nil;
[self setInfo];
}
return self;
}
我还没有实现setInfo。这就是错误开始的地方。所以,我会仔细研究每一个特定问题的尝试。
尝试#1
- (void)setInfo {
my_second_class mySecCls = myCls->get_string();
MyNSString = @(mySecCls.my_string().c_str());
}
尝试#2
- (void)setInfo {
MyNSString = @(myCls->get_string().my_string().c_str());
}
尝试#3
- (void)setInfo {
my_second_class mySecCls = myCls->get_string();
NSString *unusedString = @(mySecCls.my_string().c_str());
}
尝试#1失败,#2和#3成功。 我还必须提到,有大约75个这样的值需要每秒更新一次(我在代码中使用NSTimer),因此尝试#2会影响性能。 #3显然没用,但不知何故,它有效。我想知道为什么#1失败了,而#3和#2成功了。
如果有人能给我链接到一些适度的(不是太大,也不是太小)的Objective-C ++代码,我也会感激。
编辑: 尝试#1导致EXC_BAD_ACCESS代码= 1
感谢。
答案 0 :(得分:1)
这是我的猜测,因为我们目前缺少一些相关信息
您的get_string()
方法是否可能返回my_second_class
实例的(可能是const)引用?
如果是这种情况,则第一次尝试失败,因为mySecCls
是一个本地对象,在函数返回时被销毁。在发生破坏之后,MyNSString
指向堆栈上的某个无效内存位置。第二次尝试是有效的,因为没有创建这样的本地(即,从类的角度来看是临时的)对象,并且指针传递指向更持久的myCls
对象的内容。
(我还假设my_string()
返回const std::string&
而不是string
,或者您得到的结果临时变量存在同样的问题。)
如果您想制作像尝试#2一样的东西,但看起来更像尝试#1,您可以尝试:
- (void)setInfo {
const my_second_class& mySecCls = myCls->get_string();
MyNSString = @(mySecCls.my_string().c_str());
}
但是,这几乎等同于尝试#1。