在某个间隔之后,我有一个要执行块的NSObject类别。在这种情况下我需要软弱自己吗?
__weak ViewController *weakSelf = self;
[self runBlockAfterDelay:0.6 block:^{
weakSelf.someview = ...
}];
// Category
- (void)runBlockAfterDelay:(NSTimeInterval)delay block:(void (^)(void))block {
dispatch_async(dispatch_get_main_queue(), ^{
[self performSelector:@selector(executeBlockAfterDelay:) withObject:[block copy] afterDelay:delay];
});
}
- (void)executeBlockAfterDelay:(void(^)(void))block
{
if (block)
block();
}发布于 2013-09-26 20:59:31
您不仅不需要它(self没有强大的对块的引用,所以没有循环),如果包含它,它可能会在程序中引入严重的bug。具体来说,没有什么能阻止'self‘在块运行之前被释放(因为弱引用的全部要点是它不能阻止事物被解除分配)。
发布于 2013-09-26 21:50:58
为了给@Catfish_Man的精彩描述添加更多细节:
你可以削弱自己在块之前和在块内,你可以再次巩固它,以确保它不会在一个意想不到的时间释放。在这种情况下,应该确保块在self释放后不会执行。这很难,所以只要没有创建循环,保持强大的就更安全了。(如果self持有对块的引用,则将创建循环。)
FYI:如果你开始用信号而不是程序顺序来思考,反应性可可的最终结果可能会更令人愉悦:
NSTimeInterval delay = 0.3;
// The activator signal that fires after the delay and completes after it.
RACSignal *delayedActivator = [[RACSignal interval:delay] take:1];
@weakify(self)
// The command that we want to execute after the delay.
RACCommand *blockToExecute = [RACCommand command];
[blockToExecute addSignalBlock:^RACSignal *(id value) {
@strongify(self)
self.whatever
}];
// Wire up the command on the signal.
[delayedActivator executeCommand:blockToExecute];乍一看可能有点神秘,但信号可以让你的生活变得简单得多。特别是如果信号与self的生命周期相关联,例如,它是一个属性,则当self被释放时,它将被释放,这样可以确保在不需要时不会执行块。在这种情况下,弱化和强化是必需的。
https://stackoverflow.com/questions/19038541
复制相似问题