У меня есть большая проблема, так как несколько дней я не могу решить.Не знаю, почему мой взгляд замерзает
Во-первых у меня есть контроллер представления Войти с этим кодом:
@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
Это это все, что у меня есть, и я действительно не вижу, где я ошибаюсь.
Еще одна идея?
Спасибо за помощь!
Большое спасибо за ваш ответ! Я попробую это. Возможно, проблема возникает из-за того, когда конструируется viewcontroller. У меня нет большого кода в моем mainViewController.m. Я собираюсь изменить свое сообщение с первого viewController. –
Моя догадка заключается в том, что это связано с тем, что вы выпускаете контроллер просмотра, где вас не должно быть. В стороне, лучше не использовать имена объектов, которые совпадают с именами Apple, например здесь: 'self.navigationItem.backBarButtonItem = backBarButtonItem;' – iwasrobbed
Хорошо, я постараюсь сделать эту небольшую программу. Проблема в том, что ошибка может возникнуть случайно. Иногда это происходит после первого нажатия, а иногда и позже, но всегда на одном и том же экране. Возможно ли, что симулятор или какой-либо другой внешний параметр может изменить поведение моей программы? @IWasRobbed. Вы правы. Я не обращал внимания на имя моих объектов. Я сделаю чек на этом. Что-то я тоже не уверен: когда у меня есть контроллер представления как атрибут класса (ссылка на следующий контроллер представления), должен ли я его отпустить в моем методе dealloc или он управляется где-то еще? –