Raf*_*afi 5 memory-management objective-c objective-c-blocks retain-cycle
我听说我应该总是使用weakSelf块来避免保留周期,但是调度块呢?在这种情况下,我的方法在以下代码中处理来自我的服务器的错误响应:
//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];
});
}
Run Code Online (Sandbox Code Playgroud)
我应该weakSelf在这个块中使用和在其他块中一样吗?
你需要使用弱强的"舞蹈"来避免只有持续保留周期时的保留周期.为此,需要满足两个条件:
如果其中任何一个不成立,就没有持久的保留周期,也没有问题.
在这种情况下,两者都不是真的.通常,放在调度队列中的块不会受到保留周期的影响,除非您将块保留在ivar中以便重用.
即使我同意Josh并且从一开始就同意,没有理由弱化self,如果没有必要(该块不是被引用的对象持有),在过去大多数弱化self为默认.(我认为大多数人都会改变.)
但是,self即使没有保留周期,也有理由弱化:
您拥有由长时间运行的块填充的实例对象的图像.当块运行时,实例对象可能会死亡,即因为用户删除了它.在这种情况下,块将填充一个不再使用的实例对象,并且从模型中消失,但仍然存活,因为块保存它.弱化它会释放它并将捕获设置self为nil,易于检查,通常什么都不做.
但我真的没有想到,并且从未想过这种情况证明了经验法则"默认弱化".