如果您在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.
}
}
答案 0 :(得分:3)
C ++ lambda可以通过值或引用来捕获变量(当你声明lambda如何捕获每个变量时,你会选择)。
通过引用捕获并不感兴趣,因为在离开变量的范围之后对局部变量的引用无效,因此根本没有内存管理问题。
按值捕获:如果捕获的变量是Objective-C对象指针类型,那么它会变得有趣。如果您使用MRC,则没有任何反应。如果你正在使用ARC,那么是的,lambda“保留”捕获的对象指针类型的变量,只要它们是__strong
(不是__weak
或__unsafe_unretained
)。所以,是的,它会创建一个保留周期。