Objective-C ++为C ++对象的OBj-C属性赋值

时间:2014-02-22 18:25:16

标签: c++ objective-c xcode5 objective-c++

好的,首先,我必须承认这是我第一次使用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

感谢。

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。