在块内部分配变量需要弱引用?

时间:2016-11-22 04:46:05

标签: objective-c pointers nsdictionary objective-c-blocks

所以我有以下代码:

[serviceHandler getHomeConfigurationData:^(NSDictionary *data){
        if (data) {
            NSLog(@"The Data: %@", data);
            homeConfigData = data;
        }
    } failure:^(NSError *error, BaseServiceHandler *context){
        homeConfigData = Nil;
        NSLog(@"Error: %@", error);
    }];

在这里,homeConfigData是我的ViewController中的一个实例变量。整个方法在后台线程上完成。一旦完成块返回/被触发,ViewController可能会被释放。所以我担心如果我在行homeConfigData = data;

时遇到问题

我该如何处理?

2 个答案:

答案 0 :(得分:1)

  

ViewController一旦被释放就可能被取消分配   完成块返回/被触发。

实际上,正如现在所写的那样,可能会在块运行时解除分配ViewController,因为这两个块都保留selfself在两个块中都使用(因为使用了实例变量homeConfigData,这隐含地意味着self->homeConfigData)。

答案 1 :(得分:0)

像这样:

TreeNode getSuccessor(TreeNode treeNode) {
    if (treeNode.right != null) {
         return getLeftMostChild(treeNode.right);
    } else {
        TreeNode p = treeNode.parent;
        while (p != null && treeNode == p.right) { // traverse upwards until there is no parent (at the last node of BST and when current treeNode is still the parent's right child
            treeNode = p;
            p = p.parent; // traverse upwards
        }
        return p; // returns the parent node
    }
}

TreeNode getLeftMostChild(TreeNode treeNode) {
    if (treeNode.left == null) {
        return treeNode;
    } else {
        return getLeftMostChild(treeNode.left);
    }
}

如果所有指向self的强指针都变为nil,则实例将被释放,所有弱指针(即YourClass *__weak weakSelf = self; [serviceHandler getHomeConfigurationData:^(NSDictionary *data){ if (data) { NSLog(@"The Data: %@", data); weakSelf.homeConfigData = data; } } failure:^(NSError *error, BaseServiceHandler *context){ weakSelf.homeConfigData = Nil; NSLog(@"Error: %@", error); }]; )将变为nil。将weakSelf选择器发送到nil将是一个noop。