2016-11-09 70 views
1

我正在嘗試在Objective-C++方法中創建std::function,並將它傳遞給C++方法。如何將std :: function從Objective-C++傳遞到C++方法

但是,我收到了一個錯誤的訪問異常。

使用塊:

std::function<void(void)> callback = ^{ 
    [self doSomething]; 
}; 

callback(); // <-- this works 

self.myCppObject-> setButtonCallback(callback); 

使用Lambda:我使用的Objective-C塊和拉姆達試圖

std::function<void()> callback = [self]() { 
    [self doSomething]; 
}; 

callback(); // <-- this works 

self.myCppObject->setButtonCallback(callback); 

在我的C++類:

void MyCppClass::setButtonCallback (std::function<void()> callback) 
{ 
    buttonCallback = std::move (callback); // <-- crash here 
} 

我也試過在Objective-C++類中存儲callback作爲屬性:

@property (nonatomic, assign) std::function<void()> callback; 

異常被拋出這裏:哪些來自在C++方法回調分配(從<functional>線1717)

template<class _Rp, class ..._ArgTypes> 
function<_Rp(_ArgTypes...)>& 
function<_Rp(_ArgTypes...)>::operator=(function&& __f) _NOEXCEPT 
{ 
    if (__f_ == (__base*)&__buf_) // <-- EXC_BAD_ACCESS here 
     __f_->destroy(); 
    else if (__f_) 
     __f_->destroy_deallocate(); 
    __f_ = 0; 

    ... 

。我嘗試使用std::move和通過=複製。

UPDATE

問題竟然是那個myCppObject尚未初始化,因爲這是它初始化它的構造函數的類的子類,但是我打電話基本[super init]代替[super initWith...]的我需要的。感謝@羅曼的線索。

+0

拋出的異常究竟在哪裏? – SingerOfTheFall

+0

@SingerOfTheFall info added – Adamski

回答

2

我試圖運行您的代碼,並且只有在以前未初始化屬性self.myCppObject時才收到相同的錯誤。試着用

self.myCppObject = new MyCppClass(); 
self.myCppObject-> setButtonCallback(callback); 

更換

self.myCppObject-> setButtonCallback(callback); 

或檢查,如果你正確地設定初始屬性self.myCppObject

+0

有趣的是,'myCppObject'應該在被傳遞給這個類之前被初始化,可能與初始化順序有關。明天將調查,謝謝。 – Adamski

相關問題