3

如果您self在 Objective-C 样式块中捕获对 ARC 下的强引用,则需要使用__weak指针来避免 ARC“保留循环”问题。

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

我真的不知道保留周期是什么,但这个答案描述了一点。我只知道您应该为 Objective-C 样式块使用__weak指针。请参阅在捕获 self 时避免强引用循环

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

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

1 回答 1

4

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

通过引用捕获并不有趣,因为无论如何离开变量的范围后,对局部变量的引用都会变得无效,因此根本不存在内存管理问题。

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

于 2013-08-16T11:23:37.963 回答