所以我有以下代码:
[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;
我该如何处理?
答案 0 :(得分:1)
ViewController一旦被释放就可能被取消分配 完成块返回/被触发。
实际上,正如现在所写的那样,不可能会在块运行时解除分配ViewController,因为这两个块都保留self
为self
在两个块中都使用(因为使用了实例变量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。