block多层嵌套使用时,造成控制器对象不能释放

本文探讨了在iOS应用中,由于block多层嵌套使用导致控制器对象不能正常释放的问题。通过分析代码,可以看到在block内部使用`@weakify`和`@strongify`来避免循环引用,但仍然出现了问题。解决方案在于正确管理`__block`变量的内存,确保在不需要时释放,以保持引用计数的平衡。
<span style="white-space:pre">	</span>
    <span style="font-family: Arial, Helvetica, sans-serif;"><span style="color:#ff0000;">@weakify(self);</span></span>

    [self.customerViewModel loginCustomerLogicWithMobile:mobile
                                                Password:password
                                        NormalLoginBlock:^{
                                            @strongify(self);
                                            
                                            if ([self.customerViewModel getResponseStatus] == ZSYResponseSuccess) {
                                                if (self.navigationController.presentingViewController != nil) {
                                                    [self.navigationController dismissViewControllerAnimated:YES completion:nil];
                                                } else {
                                                    [self.navigationController popViewControllerAnimated:YES];
                                                }
                                            } else{
                                                //设置手势密码失败、注册失败,停留在手势密码界面
                                                self.buttonNext.enabled = YES;
                                                [self.txtLoginPwd becomeFirstResponder];
                                            }
                                            
                                        } ForgetGesturePasswordBlock:^{
                                            <span style="color:#ff0000;">@strongify(self);</span>
                                            
                                            <span style="color:#ff0000;"><strong>__block ZSYCustomerLoginViewController *point = self;//对指针retain一次</strong></span>
                                            [CLLockVC showSettingLockVCInVC:self successBlock:^(CLLockVC *lockVC, NSString *pwd) {
                                                
                                                //保存手势密码到服务器
                                                GesturePasswordBlock block = [point.customerViewModel saveGesturePasswordCallback];
                                                block(mobile, pwd);
                                                
                                                //密码保存成功之后,退出手势密码界面
                                                [CLLockVC dismiss:.3f Completion:nil];
                                                <span style="color:#ff0000;"><strong>point = nil;//对指针release一次,保持前后retainCount守恒</strong></span>
                                            }];
                                            
                                        } CreateGesturePasswordBlock:^{
                                            
                                            [CLLockVC showSettingLockVCInVC:self successBlock:^(CLLockVC *lockVC, NSString *pwd) {
                                                @strongify(self);
                                                
                                                //保存手势密码到服务器
                                                GesturePasswordBlock block = [self.customerViewModel saveGesturePasswordCallback];
                                                block(mobile, pwd);
                                                
                                                //密码保存成功之后,退出手势密码界面
                                                [CLLockVC dismiss:.3f Completion:nil];
                                            }];
                                        }];
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值