gpt4 book ai didi

ios - block 中的弱引用与 NSTimer 之间的区别

转载 作者:可可西里 更新时间:2023-11-01 04:33:02 24 4
gpt4 key购买 nike

正如我们所知,我们需要在 block 内使用弱引用来打破保留循环,如下所示:

__weak id weakSelf = self;
[self doSomethingWithABlock:^() {
[weakSelf doAnotherThing];
}]

然而,弱引用无法打破由 NSTimer 引起的保留周期。

__weak id weakSelf = self;
timer = [NSTimer scheduledTimerWithTimeInterval:30.0f
target:weakSelf
selector:@selector(tick)
userInfo:nil
repeats:YES]; // No luck

有什么区别?计时器怎么还能保留目标呢?

最佳答案

基于选择器的 NSTimer 技术的全部问题在于它建立了对传递给它的对象的强引用。因此,您用来保存对传递给 scheduledTimerWithTimeInterval 的目标的引用的变量本身是强是弱并不重要。假设 target 引用在基于选择器的调度计时器被调度时不是 nilNSTimer 将建立自己的强引用。调用代码中引用的“弱”与“强”性质仅指示 ARC 将在调用者代码中放置其自己的内存管理调用的位置,但 target 只是一个简单的指针,并且没有这种弱与强信息被传送到 NSTimer。基于选择器的 NSTimer 将建立自己的强引用,该引用在计时器无效之前不会被解析。

这就是为什么当我们想要使通过基于选择器的方法构建的计时器无效时,我们必须在 viewDidDisappear 等中而不是在 dealloc 中进行。

请注意,scheduledTimerWithTimeInterval 现在有适用于 iOS 10 及更高版本的基于 block 的变体,因此如果您不必支持早期的 iO​​S 版本,您可以享受 block 的弱引用模式:

typeof(self) __weak weakSelf = self;
[NSTimer scheduledTimerWithTimeInterval:30 repeats:true block:^(NSTimer * _Nonnull timer) {
// use weakSelf here
}];

关于ios - block 中的弱引用与 NSTimer 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44939379/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com