gpt4 book ai didi

ios - block 回调——当原始对象被释放时

转载 作者:行者123 更新时间:2023-11-29 02:20:43 25 4
gpt4 key购买 nike

我正在调用 DatabaseManager 来保存在 viewController 中创建的对象,如下所示:

  [DatabaseManager addUniqueObject:fooChild key:[fooParent fooChildKey] toObject:self.foo callback:^(BOOL succeeded, NSError *error) {


if (error) {
[[UIApplication sharedApplication] endBackgroundTask:self.sendBackgroundTaskId];
return;
}


[self.tableView reloadData];
[self scrollToBottomAnimated:YES];
}

[[UIApplication sharedApplication] endBackgroundTask:self.sendBackgroundTaskId];
}];

addUniqueObject 是我的 DatabaseManager 中的一个类方法(如您所见,我使用 Parse 作为后端):

 + (void)addUniqueObject:(PFObject*)uniqueObject key:(NSString*)key toObject:(PFObject*)object callback:(void(^)(BOOL succeeded, NSError *error))callback {

if (uniqueObject) {
[PFCloud callFunctionInBackground:@"addUniqueObjectToObject"
withParameters:@{@"classKey":[object parseClassName],
@"objectId":[object objectId],
@"keyToAdd":key,
@"objectToAddClassKey":[uniqueObject parseClassName],
@"objectToAddId":[uniqueObject objectId],

}
block:^(NSMutableDictionary *results , NSError *error) {
if (!error) {
callback(YES, error);
}
else {
callback(NO, error);
}
}];
}

}
  1. 第一个问题 - 因此,如果我创建此对象但随后导航离开并因此在执行保存之前弹出此 VC,则 self.tableView 或我在此时完成 block 是nil,对吗?

  2. 第二个问题 - 我将完成 block 传递给 DatabaseManager - 如果原始 VC 被销毁,这个完成对象是否仍然存在?在执行callback()之前我是否必须检查此 block 是否存在?

这似乎并没有给我带来任何问题,所以直到现在我才质疑它。但我想了解一下。

最佳答案

  1. 不,您的 VC 不会被释放,因为 self 是在 block 内捕获的。如果你想让它被释放,你应该这样写:

    __weak typeof(self) weakSelf = self; // we don't increase retain count here
    [DatabaseManager addUniqueObject:fooChild key:[fooParent fooChildKey] toObject:self.foo callback:^(BOOL succeeded, NSError *error) {
    __strong typeof(self) self = weakSelf;
    // if weakSelf is still not deallocated, it will be retained until block finishes

    考虑使用 @strongify/@weakify而不是这个代码片段。

  2. 是的。 callback 由您传递给 callFunctionInBackground:withParameters:block: 的 block 保留,因此在执行 block 之前不会释放它。如果您确定没有人会使用 callback:nil 调用您的函数,那么您不需要检查它是否仍然存在于完成 block 中。

关于ios - block 回调——当原始对象被释放时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28178628/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com