iOS dealloc崩溃

时间:2013-08-29 07:02:07

标签: ios objective-c dealloc

在这里找到一个奇怪的代码 我有一个viewcontroller,它有一个带书籍的数组,然后点击单元格,然后推送到detailViewController,detailVC有一个变量infoDict,

 @property (nonatomic,retain) NSMutableDictionary * infoDict;

navigationController push

DetailViewController * tDVC = [[DetailViewController alloc] init];
tDVC.infoDict = infoDict;
[self.navigationController pushViewController:tDVC animated:YES];
[tDVC release];

点击后退按钮,弹回,以及DetailVC内部dealloc

-(void)dealloc
{
    [super dealloc];

    NSLog(@"before %d",infoDict.retainCount);
    [infoDict release];
}

但是当我点击回来时,在这个dealloc应用程序中随机崩溃,EXC_BAD_ACCESS。

当将[super dealloc]移动到dealloc的底部时,它似乎恢复正常。 请帮助我理解这一点,非常感谢

3 个答案:

答案 0 :(得分:4)

[super dealloc]释放对象本身。如果您输入dealloc并让Xcode自动填充,则可以获得此信息:

- (void)dealloc
{
    <#deallocations#>
    [super dealloc];
}

意味着您应该在调用[super dealloc]

之前释放对象和属性

答案 1 :(得分:2)

您的-dealloc实施失灵了。对-[super dealloc] 的调用必须dealloc方法中的绝对最后一次调用。当您访问ivar infoDict时,编译器实际上正在执行类似self->infoDict的操作,此时,self已被释放并且不再有效。

如果可能的话,我建议使用ARC而不是手动管理内存。

答案 2 :(得分:-1)

尝试

如果您使用self.infoDict = nil;代替[infoDict rlease];

,效果会更好
-(void)dealloc
{
  NSLog(@"before %d",infoDict.retainCount);
  [infoDict release];

  [super dealloc];
}