当我的UITableviewContrller出现时,当我快速触摸文本字段时,我有一个奇怪的问题导致崩溃。 它并非总是发生。也许大约2次10次测试的崩溃。 它之前工作正常,但我不知道为什么它现在有时会崩溃。
iOS7.1上的iPhone4。 崩溃消息。它在OrderTableViewController中崩溃。在崩溃之前,我检查了retainCount是否为1,所以我不知道这是怎么发生的。我不知道为什么它被解除分配。
2014-04-01 09:35:57.628 [17027:60b] *** -[OrderTableViewController respondsToSelector:]: message sent to deallocated instance 0x17fef520
这是我推送viewController的代码。 我相信这是正确的。我一直都在使用它。
OrderTableViewController *orderViewController = [[OrderTableViewController alloc] initWithNibName:@"OrderTableViewController" bundle:nil];
orderViewController.hidesBottomBarWhenPushed = YES;
[self pushViewController:orderViewController animated:YES];
[orderViewController release];
我没有将textfield声明为retain。我不确定这是不是问题。 UITextField * uname; UITextField * utel;
uname = [[UITextField alloc] initWithFrame:CGRectMake(180, 8, 120, 30)];
uname.BorderStyle=UITextBorderStyleRoundedRect;
uname.keyboardType=UIKeyboardTypeNamePhonePad;
uname.delegate=self;
utel = [[UITextField alloc] initWithFrame:CGRectMake(180-40, 8, 120+40, 30)];
utel.BorderStyle=UITextBorderStyleRoundedRect;
utel.delegate=self;
utel.keyboardType=UIKeyboardTypeNumberPad;
- (void)dealloc {
[uname release];uname=nil;
[utel release];utel =nil;
[super dealloc];
}
我尝试使用zombie模板进行配置文件,但我找不到有用的东西。 这是问题。 1.对这个问题的任何想法? 2.如何解决这类问题。我尝试删除[orderViewController release]的代码;并且retainCount变为2,似乎可以进行20次测试。但是,它会导致内存泄漏。如何减少这种泄漏问题。当我不需要它时,我可以在导航控制器中释放它吗?我知道它更复杂,但我不知道更好的解决方法。 表格崩溃的消息,似乎与OrderViewController过度释放有关,但我找不到问题。是否还有其他问题导致错误消息? 谢谢你的帮助。
答案 0 :(得分:3)
请勿使用retainCount
。例如,它永远不会返回0。
问题是你的委托在视图控制器完成之前被解除分配。您可以通过将代理设置为nil
中的dealloc
来解决此问题,但这可能不正确,因为它表明您的视图控制器的寿命比事物长它也委托行为决定。
您的dealloc
方法错误;在非ARC中,您必须致电[super dealloc];
你应该使用ARC
答案 1 :(得分:1)
首先检查以确保您没有直接在其上调用dealloc。
然后尝试运行Xcode Analyzer,因为它可能会为您找到问题。
然后尝试启用Exception Breakpoint并查看它是否停止在某个地方有用。
如果这些不起作用,请尝试在OrderTableViewController上实现-retain
和-release
方法,然后在每个方法中放置断点。然后,您可以跟踪谁保留并释放它,您应该能够找到谁过度释放它。
- (id)retain
{
return [super retain];
}
-(oneway void)release
{
[super release];
}
答案 2 :(得分:0)
你应该让代表无所事事。也就是说,uname.delegate = nil
在dealloc。
答案 3 :(得分:-2)
问题很可能是你在导航控制器有机会声明所有权之前释放你的viewController。有两种方法:
将控制器推送到导航控制器后释放控制器
在推送之前自动释放您的控制器。如果你这样做,活跃的NSAutoreleasePool(你不需要担心)将在以后释放你的控制器。
[orderViewController autorelease];