2009-06-05 58 views
3

我有很多共享的C++代碼,我想在我的iPhone應用程序中使用。我將.cpp和.h文件添加到我的Xcode項目中,並在我的Objective-C++代碼中使用這些類。該項目編譯罰款0錯誤或警告。在Objective-C++中使用共享的C++/STL代碼

然而,當我運行它在模擬器中,我得到以下錯誤,當我試圖在我的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對象和cppnamemyCPlusPlusObject爲std :: string構件。

我對此有何看法?在Objective-C++中使用STL-C++類有更好的方法嗎?如果可能的話,我想保持常見的C++文件不變,以避免在兩個地方維護代碼。

在此先感謝!

回答

3

確保該字符串在將它傳遞給initWithCString函數之前不是空的。

此外,您正在使用的功能已被棄用,use this one instead

+0

謝謝你。我通過代碼,發現我沒有填充指針......菜鳥錯誤! – 2009-06-05 03:49:28

1

我想試試這個:

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

空指針可能是你的問題,因爲的std :: string將如果存在總是正確初始化,並且c_str()方法會返回一個「\ 0 '即使字符串爲空也會終止字符串。

2

還要注意的是這行代碼:

[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返回一個自動釋放的對象。它可能做,但是否確實與否不是你的關心,所有的事情你的是,你不繩子的所有權,因爲方法的名稱不符合「黃金」或「新」開頭或包含「複製」所以你不負責釋放它。

+0

很好,謝謝你。 – 2009-06-08 00:52:32