Objective c 使用C++;ARC Objective和#x2B中的11个lambda函数+;-如何做好这件事?

Objective c 使用C++;ARC Objective和#x2B中的11个lambda函数+;-如何做好这件事?,objective-c,lambda,c++11,automatic-ref-counting,objective-c-blocks,Objective C,Lambda,C++11,Automatic Ref Counting,Objective C Blocks,我有一个Objective++项目。在Objective上下文中,我使用的是ARC和iPhoneSDK 6。在C++中,我使用的是C++ 11编译器。 C++11中的Lambda函数使用引用捕获变量。ObjectiveC并不真正支持这个概念,通过“尝试并出错”,我提出了以下解决方案。有什么我不知道的陷阱吗 这个问题有更好的解决办法吗 typedef std::function<void ()> MyLambdaType; ... // m_myView will not go aw

我有一个Objective++项目。在Objective上下文中,我使用的是ARC和iPhoneSDK 6。在C++中,我使用的是C++ 11编译器。 C++11中的Lambda函数使用引用捕获变量。ObjectiveC并不真正支持这个概念,通过“尝试并出错”,我提出了以下解决方案。有什么我不知道的陷阱吗

这个问题有更好的解决办法吗

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();
typedef std::函数MyLambdaType;
...
//我的观点不会消失。ARC管理。
UIView*\uuuuuuuMyVIEW;
...
//在Objective C上下文中,我创建了一个lambda函数来调用我的Objective C对象
UIView&myViewReference=*m_myView;
MyLambdaType myLambda=[&myViewReference](){
UIView*myViewBlockScope=&myViewReference;
//使用“myViewBlockScope”执行某些操作`
}
..
//在C++11上下文中,我调用这个lambda函数
myLambda();

简单的做法是让lambda捕获对象指针变量
m_myView
(我从您的代码片段中假设这是一个局部变量),并在lambda中正常使用它:

MyLambdaType myLambda = [m_myView]() {
    // Do something with `m_myView`
}
唯一的问题是
m_myView
的内存管理。为了一般正确,lambda需要在创建时保留
m_myView
,在销毁时释放它(就像块一样;因为lambda可以在
m_myView
不存在的范围内使用)


通过阅读ARC文档,我看不到特别提到的这种情况,但我认为它应该正确处理,因为(1)C++11 lambda的捕获变量存储为匿名类的字段,在构造lambda时初始化为捕获的值,以及(2)ARC正确处理C++类对象Objy-C对象字段在构造和销毁中的保留和释放。除非它特别提到lambdas相反的内容,或者存在编译器错误,否则我看不出它不起作用的原因。

AFAIK块只是ObjectiveC,或者?如何将块传递给C++?<代码> MyLabDAType MyLAMBDA = [MyMyVIEW](){//用MyMyVIEW}做某事< /代码>不工作吗?@在这种情况下创建一个拷贝。请看这里:@LarsSchneider:是的,一份
m_myView
,一个指向你的对象的指针。这不是你想要的吗?@newacct我真是愚蠢透顶。你说得对。你想创造一个“答案”让我给你答案吗?这肯定有效。棘手的是,在C++11 lambda术语中,
m_myView
在这里被“按值”捕获。如果“通过引用”捕获它(如:
[&m_-myView](){…}
),对象
m_-myView
不会被ARC保留。如果你想一下,这是完全有意义的(即,当你通过引用告诉C++捕获<代码> MyMyVIEW/COD>)时,C++正在捕获指针的引用,而不是对对象的引用,但是术语可能有点混乱。一般来说,在C++11 lambdas中通过引用捕获是这样的。如果在C++11 lambda中通过引用捕获,则不能在捕获的变量范围之外使用该lambda。似乎m_myView使用的内存不是由ARC释放的。在我的代码中,每隔几毫秒就会有很多回调,我的内存也在稳步增长。对于在lambda函数中创建的Objective-C对象也是如此。它们也在泄漏。@AshishAwaghad您需要确保
m\u myView
没有对lambda的强引用。内存泄漏可能是因为您进入了一个保留循环。我也泄漏了一个由lambda捕获的(
NSData
)对象。通过将lambda中的语句封装在
@autoreleasepool
块中,修复了泄漏。