gpt4 book ai didi

iphone - 过度释放导致奇怪的核心数据错误?

转载 作者:可可西里 更新时间:2023-11-01 03:58:37 27 4
gpt4 key购买 nike

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

我正在创建一个托管对象(帐户),它被传递到一个 subview Controller 中,它被设置在一个保留的属性中。

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

View Controller 接口(interface):

@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 保留,所以我在 AddAccountViewControllerdealloc 中有一个条目可以释放它。

然而,当我从 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.

经过多次调试和摸索后,我发现如果我不在 AddAccountViewControllerdealloc 方法中释放帐户,该应用程序会持续正常运行并且不会出现根据仪器泄漏。

任何人都可以阐明发生了什么事吗?我从有关属性的文档中了解到,需要释放那些保留的属性。我错过了什么?

更新以回答 Kevin 的问题

ManagedObjectContext 中删除对象的代码在 RootViewController(持有子 Controller )中

// 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();
}
}
}

最佳答案

首先:这听起来像是 Apple 方面的错误。核心数据正在调用 _Unwind_Resume ,这(可能)是某种异常展开。手机上存在异常展开,但(我认为)使用 ARM ABI,它使用以 __cxa_ 开头的函数名称.你在模拟器上跑吗?哪个版本的 SDK?

当您删除对 [account release]; 的调用时,可能会有一个额外的版本 float 在“平衡”的某个地方。 .

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

如果您认为这是一个保留/释放问题,我曾经通过覆盖保留/释放/自动释放来调用 NSLog 来调试这些问题。然后我在所有这些上添加了断点,将它们设置为运行命令“bt”,然后单击自动继续。然后运行中断的东西(在我的例子中,我认为它只是一个额外的保留),打印出日志输出,把它贴在白板上,然后花半小时匹配保留和释放。

关于iphone - 过度释放导致奇怪的核心数据错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3694355/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com