【发布时间】:2013-12-03 12:30:08
【问题描述】:
在 Objective-C 中,我们知道块在运行时有 3 个实现。
-
NSGlobalBlock- 在运行时是单例的,它是在我们不使用堆栈变量的值的情况下创建的。 -
NSStackBlock- 不是单例的,它是在栈上分配的(不是在堆上),它是在我们使用一些栈变量时创建的。 -
NSMallocBlock- 在堆上分配,当我们想要将块存储为 ivar 或某个类的属性时使用,或者在堆 f.e. 中的任何位置。@property (nonatomic, copy) MyBlockType myBlock;或当我们使用Block_copy()函数时。这非常重要,因为 NSMallocBlock 会保留上下文中的对象,如果我们不正确使用块,这一事实可能会产生一些拥有周期。
所以,我的问题是:“我在哪里可以找到 C++ lambdas 运行时的完整解释,以及编译器如何处理它们?或者你能解释一下吗?使用 C++ lambdas 进行内存管理有什么具体问题吗?lambdas 在哪里?分配,在堆上还是在堆栈上?”
【问题讨论】:
-
"并且它是在我们不使用 __block 修饰符更改堆栈变量的值的情况下创建的。"否。
NSGlobalBlock用于不是 闭包 的块,即不从外部范围捕获任何局部变量。 “它是在我们对某些堆栈变量使用 _block 修饰符时创建的。”不,同样,它适用于任何 闭包 的块,即使用来自外部范围的局部变量。它不必是__block变量。 -
@newacct 你说得对,NSGlobalBlock 只能使用静态变量,谢谢!
标签: c++ objective-c lambda objective-c-blocks objective-c++