gpt4 book ai didi

ios - dealloc 问题后的 dispatch_after

转载 作者:行者123 更新时间:2023-11-28 19:56:12 30 4
gpt4 key购买 nike

在 viewDidLoad 的 MyViewController 中,我只有一个调用:

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.

self.isNeedToExecute = YES;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(20 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self doSomeSimpleThings];
});
}

-(void)doSomeSimpleThings {
if (!self.isNeedToExecute) {
return;
}
// do some simple actions
}

- (void)dealloc {
self.isNeedToExecute = NO;
}

之后在代码中弹出这个 View Controller ,所以如果没有 dispatch_after dealloc 肯定会执行。

问题:

1) 在这种情况下是否会调用 dealloc 方法(当我们有 dispatch_after 时,应该在 20 秒内执行)?

2) 这个方法[self doSomeSimpleThings];会在dealloc之后执行吗?

编辑:

我在发这个问题之前试过了,没有调用dealloc,觉得很奇怪,所以才在这里问这个问题。

最佳答案

您当前的代码创建了一个保留循环,因为您在 block 内引用了 self。您可以通过使用对 self 的弱引用来打破循环。这样你也不需要 isNeedToExecute 标志:

__weak id blockSelf = self;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(20 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[blockSelf doSomeSimpleThings];
});

View Controller 释放后 blockSelfnil 并且 doSomeSimpleThings 将不会被执行。

关于ios - dealloc 问题后的 dispatch_after,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26272003/

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