首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >弱自我必要(performSelector)

弱自我必要(performSelector)
EN

Stack Overflow用户
提问于 2013-09-26 20:55:12
回答 2查看 1.3K关注 0票数 3

在某个间隔之后,我有一个要执行块的NSObject类别。在这种情况下我需要软弱自己吗?

代码语言:javascript
复制
    __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();
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-26 20:59:31

您不仅不需要它(self没有强大的对块的引用,所以没有循环),如果包含它,它可能会在程序中引入严重的bug。具体来说,没有什么能阻止'self‘在块运行之前被释放(因为弱引用的全部要点是它不能阻止事物被解除分配)。

票数 6
EN

Stack Overflow用户

发布于 2013-09-26 21:50:58

为了给@Catfish_Man的精彩描述添加更多细节:

你可以削弱自己在块之前和在块内,你可以再次巩固它,以确保它不会在一个意想不到的时间释放。在这种情况下,应该确保块在self释放后不会执行。这很难,所以只要没有创建循环,保持强大的就更安全了。(如果self持有对块的引用,则将创建循环。)

FYI:如果你开始用信号而不是程序顺序来思考,反应性可可的最终结果可能会更令人愉悦:

代码语言:javascript
复制
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被释放时,它将被释放,这样可以确保在不需要时不会执行块。在这种情况下,弱化和强化是必需的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19038541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档