2010-07-13 2 views
1

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

Во-первых у меня есть контроллер представления Войти с этим кодом:

@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 

Это это все, что у меня есть, и я действительно не вижу, где я ошибаюсь.

Еще одна идея?

Спасибо за помощь!

ответ

5

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

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

+1

Большое спасибо за ваш ответ! Я попробую это. Возможно, проблема возникает из-за того, когда конструируется viewcontroller. У меня нет большого кода в моем mainViewController.m. Я собираюсь изменить свое сообщение с первого viewController. –

+0

Моя догадка заключается в том, что это связано с тем, что вы выпускаете контроллер просмотра, где вас не должно быть. В стороне, лучше не использовать имена объектов, которые совпадают с именами Apple, например здесь: 'self.navigationItem.backBarButtonItem = backBarButtonItem;' – iwasrobbed

+0

Хорошо, я постараюсь сделать эту небольшую программу. Проблема в том, что ошибка может возникнуть случайно. Иногда это происходит после первого нажатия, а иногда и позже, но всегда на одном и том же экране. Возможно ли, что симулятор или какой-либо другой внешний параметр может изменить поведение моей программы? @IWasRobbed. Вы правы. Я не обращал внимания на имя моих объектов. Я сделаю чек на этом. Что-то я тоже не уверен: когда у меня есть контроллер представления как атрибут класса (ссылка на следующий контроллер представления), должен ли я его отпустить в моем методе dealloc или он управляется где-то еще? –

0

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

Смежные вопросы