【发布时间】:2014-10-09 06:48:12
【问题描述】:
在 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;
}
然后在代码中弹出这个视图控制器,所以如果没有dispatch_after,dealloc 肯定会被执行。
问题:
1) 这种情况下会调用dealloc方法吗(当我们有dispatch_after时,应该在20秒内执行)?
2) 这个方法[self doSomeSimpleThings];会在dealloc之后执行吗?
编辑:
我在发布这个问题之前尝试过,并且没有调用 dealloc 并认为它很奇怪,这就是我在这里问这个问题的原因。
【问题讨论】:
-
您为什么不尝试一下并找出答案?你的问题真的是“如果我运行这段代码,会发生什么?”
-
我会怀疑当您在
dispatch_async()块中引用self时,该实例将被保留,因此将调用代码。你需要用不同的方法设置isNeedToExecute(比如viewDidDisappear)。 -
1.在 dealloc 之后不会调用 doSomeSimpleThings。 2. 只有当你的 MyViewController 将从堆栈中删除时才会调用 dealloc。所以在你的情况下它不应该调用。
-
@borrrden,请看我的版本
标签: ios objective-c multithreading dealloc