繁体   English   中英

使用Objective-C ++的共享C ++ / STL代码

[英]Using shared C++/STL code with Objective-C++

我有很多共享的C ++代码,我想在我的iPhone应用程序中使用它。 我将.cpp和.h文件添加到我的Xcode项目中,并使用了Objective-C ++代码中的类。 该项目编译正确,0错误或警告。

但是,当我在模拟器中运行它时,当我尝试在我的objective-c代码(例如.c_str() )中访问STL方法时,我得到以下错误:

Program received signal:  “EXC_BAD_ACCESS”.

Unable to disassemble std::string::c_str.

以下是导致错误的代码示例:

[name setText:[[NSString alloc] initWithCString:myCPlusPlusObject->cppname.c_str()]];

其中name是的NSTextField对象和cppname是一个std :: string成员myCPlusPlusObject

我是以正确的方式来做这件事的吗? 有没有更好的方法在Objective-C ++中使用STL-laden C ++类? 我希望尽可能保持常见的C ++文件不变,以避免必须在两个地方维护代码。

提前致谢!

在将字符串传递给initWithCString函数之前,请确保该字符串不为空。

您正在使用的功能也已弃用,请改用此功能

还要注意这行代码:

[name setText:[[NSString alloc] initWithCString:myCPlusPlusObject->cppname.c_str()]];

泄漏创建的字符串。

返回并阅读http://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html上的内存管理规则。

主要问题是你已经分配了字符串,因此你已经获得了它的所有权,然后你永远不会释放它。 您应该执行以下操作之一:

[name setText:[[[NSString alloc] initWithCString:myCPlusPlusObject->cppname.c_str() encoding:NSUTF8StringEncoding] autorelease]];

要么

NSString* myCPlusPlusString = [[NSString alloc] initWithCString:myCPlusPlusObject->cppname.c_str() encoding:NSUTF8StringEncoding];
[name setText:myCPlusPlusString];
[myCPlusPlusString release];

要么

[name setText:[NSString stringWithCString:myCPlusPlusObject->cppname.c_str() encoding:NSUTF8StringEncoding]];

就代码简单性而言,后者是最好的。 就内存使用而言,中间版本是最好的,这在iPhone上经常是一个问题。

第一个可能与最后一个相同 - 我说“可能”,因为没有保证stringWithCString返回一个自动释放的对象。 它可能会这样做,但无论它是否关注都不是你的问题,对你来说重要的是你没有取得字符串的所有权,因为方法名称不以“alloc”或“new”开头或包含“copy”所以你不负责释放它。

我会试试这个:

if (myCPlusPlusObject)
{
    [name setText:[[NSString alloc] initWithUTF8String:myCPlusPlusObject->cppname.c_str()]];
}
else
{
    [name setText:@"Plop: Bad myCPlusPlusObject"];
}

NULL指针可能是你的问题,因为std :: String总是会被正确初始化(如果它存在),并且即使字符串为空,c_str()方法也会返回'\\ 0'终止的字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM