objective-c - 我应该在调度 block 中使用 "weakSelf"吗?

标签 objective-c memory-management objective-c-blocks retain-cycle

我听说我应该始终在 block 中使用 weakSelf 以避免循环保留,但是调度 block 呢?在这种情况下,我的方法在以下代码中处理来 self 的服务器的错误响应:

//handling server errors (particularly "Token Refresh Failed" ones)
-(void)handleServerErrorResponse:(NSString *)error {
    dispatch_async(dispatch_get_main_queue(), ^{
        UIAlertController *alertController = [DialogHelper getAlertForSimpleAuthError:error];
        if ([error isEqualToString:@"Your login session has expired"]) {
            [alertController addAction:[UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action)
            {
                [MyModelDataCenter emptyDataCenter];
                [MyAPIInterface sharedInstance].authToken = nil;
                NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
                [defaults removeObjectForKey:@"authToken"];
                [defaults removeObjectForKey:@"defaultUserObjectDictionary"];
                [defaults synchronize];
                [AuthenticationHelper sharedInstance].loggedInUser = nil;
                [self.navigationController popToRootViewControllerAnimated:YES];
            }]];
        }
        else {
            [alertController addAction:[UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:nil]];
        }
        [self presentViewController:alertController animated:YES completion:nil];
    });
}

我应该像在其他 block 中一样在这个 block 中使用 weakSelf 吗?

最佳答案

只有存在持久保留周期时,您才需要使用弱-强“舞蹈”来避免保留周期。为此,需要满足两个条件:

  • block 由 block 内引用的对象拥有
  • 所有者在自己解除分配之前不释放 block

如果其中任何一个不成立,就没有持续的保留周期,也没有问题。

在这种情况下,两者均不为真。一般来说,放入调度队列的 block 不会受到保留周期的影响,除非您将 block 保留在 ivar 中以供重用。

关于objective-c - 我应该在调度 block 中使用 "weakSelf"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35052985/

相关文章:

iphone - 检查常量是否在运行时在 Obj-C 中定义

iOS:将 UTC NSDate 转换为本地时区

objective-c - 关闭ModalViewController后未传回值

c++ - 如何正确处置注入(inject)的DLL线程?

ios - 在执行之前停止后台执行

ios - 将 block 存储在实例变量中有什么用

objective-c - 提供弱引用时, block 参数是否需要指定所有权限定符?

ios - 将粒 subview 移动到屏幕前面?

qt - 将全局内存用于(大)本地/私有(private)临时。 OpenCL 中高效的数据结构

c++ - 为什么在 NULL 检查后会在指针上调用递归函数?