iPhone消息发送到解除分配的实例

时间:2014-04-01 02:07:47

标签: ios objective-c memory-management

当我的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过度释放有关,但我找不到问题。是否还有其他问题导致错误消息?  谢谢你的帮助。

4 个答案:

答案 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];