2014-02-22 97 views
1

好的,首先,我必須承認這是我第一次使用C++。隨着清除,我想繼續。問題就這麼簡單,但帶有一些(奇怪的)轉折點。我正在嘗試將C++庫封裝到Objective-C代碼中。假設名爲「my_class」的C++類有一個方法「get_string」,它返回另一個類「my_second_class」,它有一個名爲「my_string」的方法,該方法返回一個std :: string,我想把它放入一個屬性NSString爲我的Obj-C類「MyClass」命名爲「MyNSString」。Objective-C++將值分配給C++對象的OBj-C屬性

這是代碼。我跳過了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個

感謝。

+0

請發佈您的C++類的代碼 –

+0

此外,#2的性能低於#1的性能如何? –

+0

糾正我,如果我在這裏錯了,但我認爲更多的電話=少性能。所以,object = anotherObject.getObject; property1 = object.prop1; property2 = object.prop2;比property1 = anotherObject.getObject.prop1更好; property2 = anotherObject.getObject.prop2; –

回答

1

這是我的猜測,因爲我們目前缺少一些相關信息。
您的get_string()方法可能會返回一個(可能是const)對my_second_class實例的引用嗎?
如果是這樣的話,那麼第一次嘗試失敗,因爲mySecCls是一個本地對象,當函數返回時它會被銷燬。破壞發生後,MyNSString指向堆棧上的一些無效內存位置。第二次嘗試是有效的,因爲沒有這樣的本地(即從你的類的角度來看是臨時的)對象被創建,並且傳遞的指針指向更持久的對象的內容。

(我還以爲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。

+0

你對這兩個假設都是正確的。但是,這仍然不能解釋成功的嘗試#3。另外,如果你能展示一個例子會更好。正如我所說的,當談到C++時,我是一個白癡。但是,我已經開始閱讀一本書。希望我能在一週內完成。天哪,我必須學習C++,不是嗎?另外,如果你知道一些好的Objective-C++項目,我可以從中找到這樣的例子,我會很感激。不管怎麼說,還是要謝謝你。 –

+0

即使行爲未定義,嘗試#3也可能成功(即不會崩潰),因爲編譯器會優化您創建的本地NSString。這只是一個猜測 –

+0

好吧,如果我們忽略嘗試#2,我們可以推斷出這個錯誤與MyNSString有關。如果我們忽略嘗試#3,我們推斷問題出在mySecCls上。但是,在這種情況下,我們必須考慮兩者。我無法確定問題是什麼。 –