7

ObjectiveC++ 프로젝트가 있습니다. ObjectiveC 컨텍스트에서 ARC 및 iPhoneSDK 6을 사용하고 있습니다. C++에서는 C++ 11 컴파일러를 사용하고 있습니다.ARC에서 C++ 11 람다 함수 사용 ObjectiveC++ - 제대로 수행하는 방법?

C++ 11의 람다 함수는 참조가있는 변수를 캡처합니다. 이 개념은 ObjectiveC에서 실제로 지원되지 않으며 "try and error"로 다음 솔루션을 찾았습니다. 내가 모르는 함정이 있습니까?

이 문제에 대한 해결책이 더 있습니까?

typedef std::function<void()> MyLambdaType; 

... 
// m_myView will not go away. ARC managed. 
UIView * __strong m_myView; 

... 
// In Objective C context I create a lambda function that calls my Objective C object 
UIView &myViewReference = *m_myView; 
MyLambdaType myLambda = [&myViewReference]() { 
    UIView *myViewBlockScope = &myViewReference; 
    // Do something with `myViewBlockScope` 
} 

.. 
// In C++11 context I call this lambda function 
myLambda(); 
+0

블록을 사용하지 않는 이유는 무엇입니까? – kennytm

+0

AFAIK 블록은 ObjectiveC 전용입니까? 블록을 C++에 전달하려면 어떻게해야합니까? –

+0

'MyLambdaType myLambda = [m_myView]() {// m_myView가있는 무언가를하십시오}'가 작동하지 않습니까? – newacct

답변

12

수 있도록하는 것입니다 할 수있는 간단한 일이 람다 캡처 객체 포인터 변수 m_myView (나는이 지역 변수임을 당신의 조각에서 가정입니다), 그리고 람다 내부에서 일반적으로 사용 :

MyLambdaType myLambda = [m_myView]() { 
    // Do something with `m_myView` 
} 

유일한 관심사는 m_myView의 메모리 관리입니다. 일반적으로 람다는 생성 될 때 m_myView을 유지해야하며, 블록이 수행 할 때와 마찬가지로 파괴됩니다 (람다가 m_myView이없는 범위에서 사용될 수 있기 때문에).

ARC 문서를 읽는 중, 특별히 언급 한 상황이 보이지 않지만 (1) C++ 11 람다의 캡처 된 변수가 익명의 필드로 저장되어 있기 때문에 제대로 처리해야한다고 생각합니다. (2) ARC는 C++ 클래스의 Objective-C 객체 필드의 유지 및 해제를 적절하게 처리하여 생성 및 삭제시 처리합니다. 그 반대의 람다에 대해 특별히 말하지 않는 한, 또는 컴파일러 버그가 있기 때문에 그것이 작동해서는 안되는 이유는 없습니다.

+4

이것은 확실히 작동합니다. 까다로운 점은 C++ 11 람다 용어에서 'm_myView'가 "값에 의해"캡처되고 있다는 것입니다. "[& m_myView]() {...}"와 같이 "참조로"캡처하면 객체 m_myView가 ARC에 의해 유지되지 않습니다. 생각해 보면 완벽하다. (예를 들어, C++에서 참조로 'm_myView'를 캡처하도록 지시하면 C++은 객체에 대한 참조가 아닌 포인터 *에 대한 참조를 캡처한다.)하지만 용어는 약간 혼란 스러울 수있다. . – ipmcc

+0

@ ipmcc : 예. 이것은 일반적으로 C++ 11 람다에서 참조로 캡처하는 경우에 해당됩니다. C++ 11 람다에서 참조로 캡처 한 경우 캡처 한 변수의 범위를 벗어난 람다를 사용할 수 없습니다. – newacct

+0

m_myView에서 사용하는 메모리가 ARC에 의해 해제되지 않은 것 같습니다. 내 코드에서 몇 밀리 초마다 콜백이 많이 발생하고 내 기억이 꾸준히 뛰어 오릅니다. 람다 함수 내에서 생성 된 Objective-C 객체에 대해서도 동일합니다. 그들은 너무 누출하고 있습니다. –

관련 문제