【问题标题】:Is weak self necessary (performSelector)弱自我是必要的(performSelector)
【发布时间】:2013-09-26 20:55:12
【问题描述】:

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

【问题讨论】:

  • 为什么不使用 dispatch_after 来代替?
  • 之前用的是dispatch_after,但是在IOS7下,短时间间隔的精度很差……我发现在0.3秒后做一个dispatch_after,实际执行时间可能相差30%..

标签: iphone ios objective-c


【解决方案1】:

你不仅不需要它(self对块没有强引用,所以没有循环),如果你包含它,它可能会给你的程序带来严重的错误。具体来说,没有什么可以阻止“自我”在块运行之前被释放(因为弱引用的全部意义在于它不会阻止事物被释放)。

【讨论】:

  • 我不确定“可能会引入严重的错误”。如果没有其他东西保留在视图控制器上,您可能不想保留它以在延迟后运行某些东西。我看到了一些错误,因为 没有 使用了 weak 并且视图控制器的保留时间比您预期的要长。
  • @JesseRusak 没有弱,代码是正确的。使用弱,后果不清楚(可能无害,取决于代码)。最好有一个视图控制器大约半秒钟并知道代码的作用。弱是避免循环的好方法,但不太好让系统把地毯拉到你脚下。
【解决方案2】:

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

你可以在方块之前弱化自己,在方块内部你可以再次强化它,以确保它不会在意外的时间被释放。在这种情况下,应确保在释放 self 后不执行该块。这很难,所以只要不创建循环,就让它保持强大是一个更安全的选择。 (如果 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 被释放时它会被释放,这样可以确保块在不需要时不会被执行。在这种情况下,需要弱化和强化。

【讨论】:

    猜你喜欢
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 2021-01-19
    相关资源
    最近更新 更多