过度释放导致奇数核心数据错误?

时间:2010-09-12 09:38:57

标签: iphone objective-c cocoa-touch core-data ios

偶尔的读者和第一次提问者,所以请温柔:)

我正在创建一个托管对象(帐户),它正被传递到子视图控制器,并在其中设置保留的属性。

Account * account = [[Account alloc] initWithEntity:entity insertIntoManagedObjectContext:context];
AddAccountViewController *childController = [[AddAccountViewController alloc] init];
childController.title = @"Account Details"; 
childController.anAccount = account;
childController.delegate = self;

[self.navigationController pushViewController:childController animated:YES];
[childController release];
[account release];

视图控制器界面:

@interface AddAccountViewController : UIViewController {
}

@property (nonatomic, retain) IBOutlet UITextField * usernameTextField;
@property (nonatomic, retain) IBOutlet UITextField * passwordTextField;

@property (nonatomic, retain) Account * anAccount;
@property (nonatomic, assign) id <AddAccountDelegate> delegate;

- (IBAction)cancel:(id)sender;
- (IBAction)add:(id)sender;
- (IBAction)textFieldDone:(id)sender;
@end

因此,在代码示例1中,我发布了帐户对象,因为我不再对该方法感兴趣。由于 AddAccountViewController 保留了它,我在 AddAccountViewController dealloc 中有一个条目可以释放它。

但是,当我从 ManagedObjectContext 中删除对象时,应用程序崩溃时出现以下(相当不清楚)错误:

Detected an attempt to call a symbol in system libraries that is not present on the iPhone:
_Unwind_Resume called from function _PFFaultHandlerLookupRow in image CoreData.

经过多次调试&amp;拔毛我发现如果我不在 AddAccountViewController dealloc 方法中释放帐户,该应用程序可以持续正常工作,并且根据仪器不会泄漏。

任何人都可以了解最新情况吗?我从有关属性的文档中了解到需要释放的属性。我错过了什么?

更新回答凯文的问题

ManagedObjectContext 中删除对象的代码位于RootViewController(持有子控制器)中

// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

    if (editingStyle == UITableViewCellEditingStyleDelete) {
        // Delete the managed object for the given index path
        NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];

        [context deleteObject:[self.fetchedResultsController objectAtIndexPath:indexPath]];

        // Save the context.
        NSError *error = nil;
        if (![context save:&error]) {
            /*
             Replace this implementation with code to handle the error appropriately.

             abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. If it is not possible to recover from the error, display an alert panel that instructs the user to quit the application by pressing the Home button.
             */
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        }
    }  
}

3 个答案:

答案 0 :(得分:1)

首先:这听起来像苹果公司的一个漏洞。核心数据正在调用_Unwind_Resume,这可能是某种异常的解除。手机上存在异常展开,但(我认为)使用ARM ABI,它使用以__cxa_开头的函数名称。你在模拟器上运行吗?哪个版本的SDK?

当您移除对[account release];的调用时,可能会有一个额外的版本浮动在某处“平衡”。

“仪器没有显示任何泄漏”并不意味着没有任何泄漏;最后我检查它被周期弄糊涂了(即如果你忘了在dealloc中取消设置IBOutlets,它就不会显示泄漏)。我使用NSMutableData * d = [NSMutableData dataWithLength:1<<20]; memcpy(d.mutableBytes, &d, 4);进行了测试,但更简单的测试只是[[UIView alloc] initWithFrame:CGRectZero]

如果你认为这是一个保留/释放问题,我曾经通过重写retain / release / autorelease调试这些来调用NSLog。然后我在所有这些上添加了断点,将它们设置为运行命令“bt”,然后单击autocontinue。然后运行中断的东西(在我的情况下,我认为它只是一个额外的保留),打印出日志输出,将其粘贴在白板上,花半小时匹配保留和释放。

答案 1 :(得分:1)

我有一个类似的问题以a结尾 “检测到试图调用iPhone上不存在的系统库中的符号: _Unwind_Resume从图像CoreData中的函数_PFFaultHandlerLookupRow调用。“ 错误信息。

我的问题是模型中关系的错误“级联”删除规则。使用此规则,我的顶级托管对象已被删除但仍在代码中引用。 将此关系的“删除规则”设置为“nulify”后,一切都按设计工作。

- &GT;没有核心数据问题......设计问题!

约翰尼

答案 2 :(得分:0)

当您删除任何托管对象时,系统将自动释放与该对象相关的所有引用。所以没有必要以编程方式重新定义对象。删除对象后,您无法访问父类中的该对象。

相关问题