Я не знаю, почему мой взгляд замерзает - PullRequest
1 голос
/ 13 июля 2010

У меня есть большая проблема за несколько дней, которую я не могу решить.

Сначала у меня есть контроллер вида входа в систему с этим кодом:

@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];
}

После этого есть MMMainViewController с этим кодом:

@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];
}

Слой MMAccountViewController, загруженный из MMMainViewController, является базовым контроллером представления, в котором ничего нет.


Теперь проблема в том, что иногда, когда я загружаю свой контроллер представления с вкладками и я возвращаюсь к контроллеру входа в систему, экран зависает и появляется сообщение (NSZombieEnabled = YES):

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

Это все, что у меня есть, и я действительно не вижу, в чем я не прав.

Еще идеи?

Спасибо тем, кто мне помогает!

Ответы [ 2 ]

5 голосов
/ 13 июля 2010

Вы что-то перепродали где-то.Возможно, вы захотите запустить свое приложение в Instruments, чтобы проверить, где это может происходить (XCode: Run-> Run With Performance Tool-> Leaks даст вам настройку, которая вам нужна).Я ничего не вижу в вашем коде, но вы сами сказали, что вы используете «грубо» этот код, поэтому его может не быть в этой части вашей программы.

Обновление: я все еще не вижу этогоВы что-то переусердствовали где-то ... Я почти уверен, что проблема не в этой части кода.Если вы еще не обнаружили проблему, вы можете попытаться создать тестовый пример, то есть небольшую программу, которая пытается имитировать поведение этих программ и воспроизводить ошибку.Если вы сможете воспроизвести его в небольшой программе, я посмотрю на это.

0 голосов
/ 19 июля 2011

Я также столкнулся с той же проблемой, и проблема заключалась в том, что я назначал UIButton для rightNavigationItem и освобождаю этот экземпляр кнопки, я просто удаляю код разблокировки и начинаю работать.

...