[英]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.