使用C ++`function`块时是否需要使用弱指针(与Objective C块相对)

时间:2013-08-15 19:09:08

标签: automatic-ref-counting block objective-c++

如果您在Objective-C样式块中捕获ARC下self的强引用,则需要使用__weak指针来避免ARC"保留周期"问题

// Right way:
- (void)configureBlock {
  XYZBlockKeeper * __weak weakSelf = self;
  self.block = ^{
    [weakSelf doSomething];   // capture the weak reference
                              // to avoid the reference cycle
  }
}

我真的不知道保留周期是什么,但this answer对此有所描述。我只知道你应该为Objective-C样式块使用__weak指针。请参阅Avoid Strong Reference Cycles when Capturing self

但我的问题是,在C ++ self块下捕获<functional>时是否需要创建弱指针?

- (void)configureBlock {
  self.block = [self](){
    [self doSomething]; // is this ok? It's not an objective C block.
  }
}

1 个答案:

答案 0 :(得分:3)

C ++ lambda可以通过值或引用来捕获变量(当你声明lambda如何捕获每个变量时,你会选择)。

通过引用捕获并不感兴趣,因为在离开变量的范围之后对局部变量的引用无效,因此根本没有内存管理问题。

按值捕获:如果捕获的变量是Objective-C对象指针类型,那么它会变得有趣。如果您使用MRC,则没有任何反应。如果你正在使用ARC,那么是的,lambda“保留”捕获的对象指针类型的变量,只要它们是__strong(不是__weak__unsafe_unretained)。所以,是的,它会创建一个保留周期。