目标-C++;将值从C+分配给OBj-C属性+;对象 当然,首先,我必须承认这是我第一次使用C++。这件事办妥后,我想继续。问题就这么简单,但有些(奇怪的)扭曲。我试图把C++库包装成Objtovi-C代码。假设C++类名为“MyOrthCype”,它有一个方法“GETString”,它返回另一个类“MySuxIdBype”,它有一个名为“MyString”的方法,它返回一个STD::string,我想把它放入一个名为“Mysstring”的属性NString中,用于我的Obj-C类“MyCype”。
这是密码。我跳过了include/imports和“使用名称空间”部分。它们是存在的 MyClass.h目标-C++;将值从C+分配给OBj-C属性+;对象 当然,首先,我必须承认这是我第一次使用C++。这件事办妥后,我想继续。问题就这么简单,但有些(奇怪的)扭曲。我试图把C++库包装成Objtovi-C代码。假设C++类名为“MyOrthCype”,它有一个方法“GETString”,它返回另一个类“MySuxIdBype”,它有一个名为“MyString”的方法,它返回一个STD::string,我想把它放入一个名为“Mysstring”的属性NString中,用于我的Obj-C类“MyCype”。,c++,objective-c,xcode5,objective-c++,C++,Objective C,Xcode5,Objective C++,这是密码。我跳过了include/imports和“使用名称空间”部分。它们是存在的 MyClass.h @interface Torrent : NSObject { my_class myCls; @property NSString *MyNSString; - (instancetype)initWithHandle:(void*)handle; - (void)setInfo; @end 我的班级 @implementation MyClass @synthesize
@interface Torrent : NSObject {
my_class myCls;
@property NSString *MyNSString;
- (instancetype)initWithHandle:(void*)handle;
- (void)setInfo;
@end
我的班级
@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;
}
尝试#2
尝试#3
尝试1失败,尝试2和尝试3成功。
我还必须提到,大约有75个这样的值需要每一秒钟更新一次(我在代码中使用NSTimer),因此尝试#2会影响性能#3显然是无用的,但不知何故,它是有效的。我想知道为什么#1失败了,而#3和#2成功了
如果有人能给我一些适度(不太大,也不太小)的Objective-C++代码的链接,我也将不胜感激
编辑:
尝试#1导致EXC#U BAD#U访问代码=1
谢谢。这是我的猜测,因为我们目前缺少一些相关信息。
您的
get\u string()
方法是否可能返回对my\u second\u类
实例的引用(可能是常量?如果是这种情况,那么第一次尝试将失败,因为
mySecCls
是一个本地对象,在函数返回时会被销毁。销毁发生后,MyNSString
指向堆栈上的某个无效内存位置。第二次尝试之所以有效,是因为没有创建这样的本地(即从类的角度来看是临时的)对象,并且传递的指针指向更持久的myCls
对象的内容
(我还假设my_string()
返回一个const std::string&
而不是字符串,否则您会遇到与生成的临时变量相同的问题)
如果您想制作类似于“尝试2”,但看起来更像“尝试1”的产品,您可以尝试:
- (void)setInfo {
const my_second_class& mySecCls = myCls->get_string();
MyNSString = @(mySecCls.my_string().c_str());
}
但是,这相当于尝试1。
请将代码发布到C++类中,那么,尝试2的性能如何低于1?如果我错了,请纠正我,但我假设更多的调用=更少的性能。因此,object=anotherObject.getObject;property1=object.prop1;property2=object.prop2;优于property1=anotherObject.getObject.prop1;property2=anotherObject.getObject.prop2;你的两个假设都是对的。但是,这仍然不能解释成功的尝试3。另外,如果你能举个例子就更好了。就像我说的,当我说到C++时,我是个白痴。但是,我已经开始读一本书了。希望我能在一周内完成。天啊,我得学C++,不是吗?另外,如果你知道一些好的Objective-C++项目,我可以从中找到这样的例子,我将不胜感激。无论如何,谢谢。尽管行为未定义,但尝试#3很可能会成功(即不会崩溃),因为编译器会优化掉您创建的本地NSString。这只是一个猜测,如果我们忽略了尝试2,我们可以推断错误与MyNSString有关。如果我们忽略了尝试3,我们推断问题在于mySecCls。但是,在这种情况下,我们必须同时考虑这两种情况。我无法决定问题是什么。所谓“工作”,我指的是有正确的行为,而不是“不崩溃”。尝试#3可能不会崩溃,但它也没有任何用处。不,我使用了断点,分配的值是正确的。也许我们应该在聊天时讨论这个问题。它有点太长了,然后贴出正确的答案。
- (void)setInfo {
MyNSString = @(myCls->get_string().my_string().c_str());
}
- (void)setInfo {
my_second_class mySecCls = myCls->get_string();
NSString *unusedString = @(mySecCls.my_string().c_str());
}
- (void)setInfo {
const my_second_class& mySecCls = myCls->get_string();
MyNSString = @(mySecCls.my_string().c_str());
}