繁体   English   中英

弱自我必要(performSelector)

[英]Is weak self necessary (performSelector)

我有一个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();
}

你不仅不需要它(自己没有对块的强引用,所以没有循环),如果你包含它,它可能会给你的程序带来严重的错误。 具体来说,没有任何东西可以阻止'self'在块运行之前被释放(因为弱引用的整个点是它不会阻止事件被释放)。

只是为@ Catfish_Man的精彩描述添加更多细节:

您可以在阻止之前弱化自我,在阻止内部,您可以再次强化它以确保它不会在意外时间释放。 在这种情况下,应该确保在释放self之后不执行该块。 这很难, 只要没有创建循环保持强大是一个更安全的选择 (如果自己持有对块的引用,则会创建循环。)

仅供参考:如果您开始考虑信号而不是程序排序,那么使用Reactive Cocoa的最终结果可能更令人满意:

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时释放,这样可以确保在不需要时不执行该块。 在这种情况下,需要弱化和强化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM