对象dealloc仅在iOS 4.3中崩溃

时间:2011-12-26 20:13:31

标签: iphone ios uitableview crash pushviewcontroller

我想弄清楚为什么在我的tableView中使用didSelectRowAtIndexPath推送一个viewController会导致iOS 4.3崩溃,但在iOS 5.0+中,它运行正常。

我打电话时它崩溃了:

self.customViewController = [[[CustomViewController alloc] initWithNibName:@"CustomViewController"bundle:nil] autorelease];

第一次推送customViewController后的任何时间。

这是我的相关代码:

@property (nonatomic, retain) CustomViewController *customViewController;

-(void) dealloc // Dealloc of tableView.
{

[customViewController release];
customViewController = nil;

}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

self.customViewController = [[[CustomViewController alloc] initWithNibName:@"CustomViewController"bundle:nil] autorelease]; // Release old, allocate new, set it.

[[self navigationController] pushViewController:customViewController animated:YES];
[customViewController release]; // Balance out pushViewController's retain.


}

感谢。

2 个答案:

答案 0 :(得分:2)

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
self.customViewController = [[[CustomViewController alloc] initWithNibName:@"CustomViewController"bundle:nil] autorelease];
[[self navigationController] pushViewController:customViewController animated:YES];
[customViewController release]; // Balance out pushViewController's retain. ---->NO
}

最后release是一个不需要的额外的autorelease 您已经对其retain count做了self.customViewController = [[[CustomViewController alloc] initWithNibName:@"CustomViewController"bundle:nil] autorelease]; 一个。


我们将分析这一行

CustomViewController

您创建autorelease保留计数== 1.
你说self.customViewController就可以了,所以保留计数将在0之后(可能是运行循环的结束),但是现在它仍然是1,这就是为什么你仍然可以访问它,但是将其视为0。 /> 之后你说Balance,该属性是保留的,所以保留计数== 1。 而且你在dealloc中照顾那个1 截至您的评论:

  

//平衡pushViewController的保留。

你没有YOU own那些,你只平衡一个{{1}}。如果系统在您的对象上保留,它将在系统不再需要它时释放它们。

答案 1 :(得分:1)

不要发布customViewController。您在分配时已经自动发布了它,因此您已经放弃了alloc的所有权。您不必再次释放或自动释放该对象。导航控制器取得所有权,并在适当的时候自行放弃。

此外,您可能会在一个版本而不是另一个版本中看到它,这很巧合。这是一个内存管理问题,因此每当您运行应用程序时,您可能看到的任何损坏(崩溃等)都将取决于设备上的内存状态。您可能一直看到崩溃,从未或仅在运行Skype之后但在打开照片应用程序之前。

查找这些内容的好方法是在调试会话期间启用僵尸。启用僵尸后,对象永远不会被释放。相反,他们被置于一个僵尸状态,如果他们再次发送消息,他们将中止应用程序,并显示发送迷路消息的位置,以帮助您调试内存问题。