【问题标题】:Message Sent To Deallocated Instance Error消息发送到解除分配的实例错误
【发布时间】:2011-06-06 19:18:15
【问题描述】:

我在行 [muscleURL release]; 的 dealloc 方法中说 *** -[CFString release]: message sent to deallocated instance 0x7021e80 时出现崩溃

muscleURL 的初始值是 @property (nonatomic, retain) NSString *muscleURL;

仅当我单击导航栏中的完成按钮时才会发生这种情况。下面是相关代码:

- (void)viewDidLoad
{
    UIBarButtonItem * doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(dismissView)];
    [self.navigationItem setRightBarButtonItem:doneButton];
    [doneButton release];
}

-(void)dismissView
{
    [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:([self.navigationController.viewControllers count] -3)] animated:YES];
}

编辑:

在父视图中,父视图的muscleURL是这样初始化的

-(void)didSelectRowAtIndexPath
{
    NSString *muscleURL = [[self.muscleArray objectAtIndex:indexPath.row]objectForKey:@"musclePicture"];
    detailViewController.muscleURL = muscleURL;
}

【问题讨论】:

  • 你能显示你初始化muscleURL的代码吗?
  • 在父视图的didSelectRowAtIndex方法中,我有detailViewController.muscleURL = self.muscleURL。
  • .... 也是你调用 [muscleURL release] 的代码,可能你是 dealloc 方法。您看到的错误很可能是由muscleURL 的不平衡保留释放调用引起的。
  • 那么父视图中的“muscleURL”是如何被初始化的呢?
  • 我将代码添加到问题中。谢谢。

标签: iphone objective-c xcode memory-management dealloc


【解决方案1】:
    NSString *muscleURL = [[self.muscleArray objectAtIndex:indexPath.row]objectForKey:@"musclePicture"];

这会返回一个自动释放的对象,因此您不需要在您的 dealloc 方法中释放它,因为系统已经释放了内存。阅读 Objective-C 内存管理可能是一个好主意,Apple Developer 网站上有一个文档。

【讨论】:

  • 我不会释放那个字符串。该字符串在 parentView 的 didSelectRowAtIndex 方法中初始化。我在 dealloc 中发布的 muscleURL 是 childView 中的一个变量。
  • 事实证明,我在didSelectRowAtIndexPath 的末尾确实有一个 [muscleURL release] 用于该 NSString,我将其删除。不再崩溃!
  • 虽然这导致了答案,但 you do not need to release it in your dealloc 的声明是错误的,因为它将通过属性分配保留。 didSelectRowAtIndexPath: 方法中的无关版本是问题所在。
  • 我很抱歉,当他说它发生在他的 dealloc 方法中时,他没有说在哪个控制器中,所以对我来说,它似乎是在父 dealloc 方法中释放的,这是细节视图控制器有责任在对象通过属性后释放对象。虽然我的回答不正确,但我希望你能理解我为什么这么认为。
【解决方案2】:

试试这个。

- (void)viewDidLoad
{
UIBarButtonItem * doneButton = [[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(dismissView)]autorelease]; 
[self.navigationItem setRightBarButtonItem:doneButton];

}

-(void)didSelectRowAtIndexPath
{
NSString *tempURL = [[self.muscleArray objectAtIndex:indexPath.row]objectForKey:@"musclePicture"];
detailViewController.muscleURL = tempURL;
}

【讨论】:

  • 我很确定您必须使用[doneButton release];,这与我的代码有什么区别?您刚刚将 NSString 名称从 muscleURL 更改为 temp URL`?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-11
  • 2013-06-04
  • 2012-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多