I don't know why my view is freezing

回眸只為那壹抹淺笑 提交于 2019-12-13 19:02:40

问题


I have a big problem since a few days that I can't solve.

First I have a login view controller with this code :

@implementation MMConnectionViewController
@synthesize login, password, activityIndicator, mainVC;


- (BOOL)textFieldShouldReturn:(UITextField *)aTextField 
{
 [aTextField resignFirstResponder];

 [self performSelectorOnMainThread:@selector(startRolling) withObject:nil waitUntilDone:NO];

 [NSThread detachNewThreadSelector:@selector(connect) toTarget:self withObject:nil];

 return YES;
}


- (void)viewWillAppear:(BOOL)flag {
    [super viewWillAppear:flag];
    [login becomeFirstResponder];
 login.keyboardAppearance = UIKeyboardAppearanceAlert;
 password.keyboardAppearance = UIKeyboardAppearanceAlert;
 [self setTitle:@"Monaco Marine"];
 UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Logout"
                    style:UIBarButtonItemStyleBordered
                   target:nil
                   action:nil];
 self.navigationItem.backBarButtonItem = backBarButtonItem;
 [[UIApplication sharedApplication] setStatusBarStyle: UIStatusBarStyleBlackOpaque];
 [backBarButtonItem release];
}

- (void)connect {

 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

 mainVC = [[MMMainViewController alloc] initWithLogin:login.text password:password.text connectPass:@"1" navigationController:self.navigationController nibName:@"MMMainViewController" bundle:nil];


 if (mainVC) {
  [self performSelectorOnMainThread:@selector(dataLoadingFinished) withObject:nil waitUntilDone:YES];
 }

 [pool release];
}

- (void)dataLoadingFinished {
 self.stopRolling;
 [self.navigationController pushViewController:mainVC animated:YES];
}

- (void)showAlertWithMessage:(NSString *)message {
 self.stopRolling;
 NSLog(@"%@",message);
 UIAlertView *warning = [[UIAlertView alloc] initWithTitle:@"Connection Failed" message:[NSString stringWithFormat:@"%@",message] delegate:self cancelButtonTitle:@"Retry" otherButtonTitles:nil];
 [warning show];
 [warning release];
}

- (void)startRolling {
 [activityIndicator startAnimating];
}

- (void)stopRolling {
 [activityIndicator stopAnimating];
}


- (void)viewDidLoad {
 [login becomeFirstResponder];
}

- (void)dealloc {
 [login release],login=nil;
 [password release],password=nil;
 [activityIndicator release],activityIndicator=nil;
    [super dealloc];
}

After, there's MMMainViewController with this code :

@implementation MMMainViewController
@synthesize login, password, connectPass, navigationController, accountVC;


- (void)viewDidLoad {

 // Set a title for each view controller. These will also be names of each tab
 accountVC.title = @"Account";

 accountVC.tabBarItem.image = [UIImage imageNamed:@"icon_user.png"];

 self.view.frame = CGRectMake(0, 0, 320, 480);

 // Set each tab to show an appropriate view controller
 [self setViewControllers:
  [NSArray arrayWithObjects:accountVC, nil]];

 [navigationController setNavigationBarHidden:NO animated:NO];

 UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Menu"
                   style:UIBarButtonItemStyleBordered
                  target:nil
                  action:nil];
 self.navigationItem.backBarButtonItem = backButton;

 [backButton release];


 [self setTitle:@"Menu"];

}



// The designated initializer.  Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.
- (id)initWithLogin:(NSString *)l password:(NSString *)p connectPass:(NSString *)c navigationController:(UINavigationController *)navController nibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {

 UIView *contentView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
 contentView.backgroundColor = [UIColor whiteColor];
 self.view = contentView;
 [contentView release];

 login = l;
 password = p;
 connectPass = c;
 navigationController = navController;

 if (!accountVC)
  accountVC = [MMAccountViewController alloc];

 [self.accountVC
  initWithNibName:@"MMAccountViewController" bundle:nil];

 self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
 return self;


}

- (void)dealloc {
 [connectPass release];
 [login release];
 [password release];
    [super dealloc];
}

The layer MMAccountViewController loaded from MMMainViewController is a basic view controller with nothing in it.


Now the problem is that sometimes when load my tabbed view controller and I go back to the login view controller, the screen freezes and bug with message (NSZombieEnabled = YES) :

*** -[CALayer retain]: message sent to deallocated instance 0xd0199d0

This is all I have and I really can't see where I'm wrong.

Some more idea?

Thanks for those who help me!


回答1:


You are overreleasing something somewhere. You might want to run your application in Instruments to check where it may be happening (XCode: Run->Run With Performance Tool->Leaks will give you the setup that you need afaik). I can't see anything in your code, but you said yourself that you use "roughly" this code, so it may not be in this part of your program.

Update: I still can't see that you overrelease something somewhere... I'm pretty sure the problem is not within this part of the code. If you haven't found the problem yet, you may want to try and create a test case, that is, a small program that tries to mimic this programs behavior and reproduce the bug. If you can reproduce it within a small program, I'll take a look at that.




回答2:


I was also encounter the same problem, and the problem was that I was assigning a UIButton to the rightNavigationItem and release that button instance, I just remove the release code and started working.



来源:https://stackoverflow.com/questions/3238823/i-dont-know-why-my-view-is-freezing

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!