[self presentViewController:vc animated:YES completion:^{ }] NSMutableArray* array = [self.navigationController.viewControllers mutableCopy]; |
|
push本来就不销毁啊,用 present 切换才是销毁的
|
|
但push完我需要销毁,原来的界面用不上了,present也不销毁,但我也要销毁 |
|
假设你有两个VC,一个是VC1,一个是VC2,想进入VC2的时候把VC1释放掉是可以的(例如一些 app 的登录页面),这种情况下,在VC1的时候不要直接push VC2,而是通过navigationController的setViewControllers去手动管理VC栈,如: NSMutableArray *arr = self.navigationController.viewControllers.mutableCopy /* arr remove VC1 */ /* arr add VC2 */ [self.navigationController setViewControllers:arr animated:YES]; |
|
我这样操作了,navi里没有了,但是push后还是没执行dealloc方法,是其他地方的问题吗 |
|
40分 |
你的 VC1 有内存泄漏,检查下 |
好的,谢谢,我再检查下
|
|
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. self.title = @"登录"; [self createUI]; } -(void)createUI{ self.userNameTF = [[UITextField alloc]initWithFrame:CGRectMake(44, 100, ScreenWidth-44*2, 40)]; self.userNameTF.backgroundColor = [UIColor whiteColor]; self.userNameTF.placeholder = @"用户名"; self.userNameTF.borderStyle = UITextBorderStyleBezel; self.userNameTF.clearButtonMode = UITextFieldViewModeWhileEditing; self.userNameTF.delegate = self; [self.view addSubview:self.userNameTF]; self.passwordTF = [[UITextField alloc]initWithFrame:CGRectMake(_userNameTF.left, _userNameTF.bottom+20, _userNameTF.width, _userNameTF.height)]; self.passwordTF.backgroundColor = [UIColor whiteColor]; self.passwordTF.placeholder = @"密码"; self.passwordTF.borderStyle = UITextBorderStyleBezel; self.passwordTF.clearButtonMode = UITextFieldViewModeWhileEditing; self.passwordTF.secureTextEntry = YES; self.passwordTF.delegate = self; [self.view addSubview:self.passwordTF]; UIButton* loginButton = [[UIButton alloc]initWithFrame:CGRectMake(ScreenWidth/2 - 50, _passwordTF.bottom+20, 100, 44)]; loginButton.backgroundColor = [CustomColor blue]; loginButton.titleLabel.font = [UIFont boldSystemFontOfSize:18]; [loginButton setTitle:@"登 录" forState:UIControlStateNormal]; [loginButton addTarget:self action:@selector(login) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:loginButton]; } //登录 -(void)login{ if ([self.userNameTF.text isEqualToString:@""]){ [super showHUD:@"请输入用户名!"]; return; } else if ([self.passwordTF.text isEqualToString:@""]){ [super showHUD:@"请输入密码!"]; return; } [super showHUD:@"登录中..." isDim:NO]; [GUtils loginUserByUserName:self.userNameTF.text andPassword:self.passwordTF.text completion:^(id obj) { dispatch_async(dispatch_get_main_queue(), ^{ [super removeHUD]; if ([obj isEqualToString:@"1"]) { //登录成功 HomeViewController* vc = [[HomeViewController alloc]init]; NSMutableArray *array = [self.navigationController.viewControllers mutableCopy]; [array removeObject:self]; [array addObject:vc]; [self.navigationController setViewControllers:array animated:YES]; } else if ([obj isEqualToString:@"-2"]) { [super showHUD:@"账号不存在!"]; } else if ([obj isEqualToString:@"-1"]) { [super showHUD:@"密码错误!"]; } else if ([obj isEqualToString:@"null"]) { [super showHUD:@"系统繁忙,请稍候重试!"]; } }); }]; } -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ [self.userNameTF resignFirstResponder]; [self.passwordTF resignFirstResponder]; } #pragma mark -TextFieldDelegate - (BOOL)textFieldShouldReturn:(UITextField *)textField{ [textField resignFirstResponder]; return YES; } 这是我登录界面的代码 |
|
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. self.view.backgroundColor = [CustomColor lightGray]; if (self.navigationController.viewControllers.count > 1 ) { UIButton *button = [[UIButton alloc]init]; // [button setImage:[UIImage imageNamed:@"return.png"] forState:UIControlStateNormal]; // [button setImage:[UIImage imageNamed:@"return_on.png"] forState:UIControlStateHighlighted]; [button setTitle:@"后退" forState:UIControlStateNormal]; button.backgroundColor = [CustomColor deepGray]; button.frame = CGRectMake(0, 0, 44, 44); [button addTarget:self action:@selector(backAction) forControlEvents:UIControlEventTouchUpInside]; UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithCustomView:button]; self.navigationItem.leftBarButtonItem = backItem; } } -(void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; } -(void)backAction{ [self.navigationController popViewControllerAnimated:YES]; } //设置导航栏上的标题 - (void)setTitle:(NSString *)title { [super setTitle:title]; UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectZero]; titleLabel.textColor = [UIColor whiteColor]; titleLabel.font = [UIFont boldSystemFontOfSize:18.0f]; titleLabel.backgroundColor = [UIColor clearColor]; titleLabel.text = title; [titleLabel sizeToFit]; self.navigationItem.titleView = titleLabel; } #pragma mark -HUD -(void)showHUD:(NSString*)title{ //如果之前有,先移除 if (self.hud) { [self.hud removeFromSuperview]; } self.hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES]; // self.hud.customView=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"37x-Checkmark.png"]]; self.hud.customView = [[UIView alloc]init]; self.hud.mode=MBProgressHUDModeCustomView; self.hud.labelText=title; [self.hud hide:YES afterDelay:1]; } -(void)showHUD:(NSString*)title withDelay:(CGFloat)time{ //如果之前有,先移除 if (self.hud) { [self.hud removeFromSuperview]; } self.hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES]; // self.hud.customView=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"37x-Checkmark.png"]]; self.hud.customView = [[UIView alloc]init]; self.hud.mode = MBProgressHUDModeCustomView; self.hud.labelText = title; [self.hud hide:YES afterDelay:time]; } -(void)showHUD:(NSString *)title isDim:(BOOL)isDim { //如果之前有,先移除 if (self.hud) { [self.hud removeFromSuperview]; } self.hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES]; self.hud.dimBackground = isDim; self.hud.labelText = title; } -(void)removeHUD{ if (self.hud) { [self.hud removeFromSuperview]; } } -(void)dealloc{ NSLog(@"%@",[NSString stringWithFormat:@"%@销毁",[self class]]); } 这是登录界面继承的类的代码 ,不知道哪里内存泄露了,界面不销毁,push出去然后pop出来的部分界面也不销毁,是这个类的问题吗 |
|
这样看似乎没有, 你通过注释代码来做点测试吧,比如把 login 里的方法都注释掉,只调用登录成功后的那段:
//登录成功 HomeViewController* vc = [[HomeViewController alloc]init]; NSMutableArray *array = [self.navigationController.viewControllers mutableCopy]; [array removeObject:self]; [array addObject:vc]; [self.navigationController setViewControllers:array animated:YES]; 看有没有被释放,如果这里没有的话,在其他方法里再试试 |
|
注释掉可以了,请求出了问题,我再研究下,谢谢 |
|
祝早日解决 |