我目前正在使用 Core Data 编写 Iphone 应用程序,并且EXC_BAD_ACCESS
在 [managedObjectContext save:&&error] 代码行期间出现错误。此崩溃仅在我修改某些字段后发生。更具体地说,我的实体有两个字符串字段(大约 10 个字段),它们从模式视图控制器(如文本编辑器)的返回中获取它们的值。崩溃也只发生在编辑这些字段之后,我第一次在其中输入一个值就可以了。
我有带有格式构造函数的字符串只有字符串的原因是因为我试图复制构造......不确定这是否会自动发生?认为可能来自这些字符串的保留/释放消息(这两个来自模态视图控制器),在模态视图控制器或其他东西被解除时被释放。猜猜不是因为它仍然不起作用。
这是崩溃的代码部分:
[编辑]
- (void)actionSheet:(UIActionSheet *)modalView clickedButtonAtIndex: (NSInteger)buttonIndex
switch(buttonIndex) {
case 0: {
if(message == nil) {
message = [NSEntityDescription insertNewObjectForEntityForName:@"MailMessage" inManagedObjectContext:self.managedObjectContext];
}
message.toString = txtTo.text;
message.fromString = txtFrom.text;
message.subjectString = txtSubject.text;
message.backgroundColor = [NSNumber numberWithInt:[bgColor intValue]];
message.textArray = [NSString stringWithFormat:@"%@", stringTextArray];
message.htmlString = [NSString stringWithFormat:@"%@", stringHTML];
message.timeStamp = [NSDate date];
message.statusCode = [NSNumber numberWithInt:0];
NSError *error = nil;
if (![message.managedObjectContext save:&error]) {
abort();
}
break;
}
case 1: {
break;
}
}
if(buttonIndex != modalView.cancelButtonIndex) {
[webViewBody loadHTMLString:@"<html><head></head><body></body></html>" baseURL:[NSURL URLWithString:@""]];
[self.navigationController popToRootViewControllerAnimated:YES];
}
}
这是崩溃日志:
异常类型:EXC_BAD_ACCESS (SIGBUS) 异常代码:0x00000015 处的 KERN_PROTECTION_FAILURE 崩溃的线程:0 线程 0 崩溃: 0 libobjc.A.dylib 0x30011940 objc_msgSend + 20 1 核心数据 0x367f7d3e -[NSKnownKeysDictionary1 释放] + 82 2 CoreData 0x367f7cda -[NSKnownKeysDictionary1 版本] + 34 3 核心数据 0x3687eec4 -[NSManagedObject(_NSInternalMethods) _setOriginalSnapshot__:] + 40 4核心数据0x36821030-[NSManagedObjectContext(_NSInternalAdditions)_clearOriginalSnapshotAndInitializeRec:]+16 5 核心数据 0x368205f2 -[NSManagedObjectContext(_NSInternalAdditions)_didSaveChanges] + 958 6 核心数据 0x368133bc -[NSManagedObjectContext 保存:] + 412 7 Decome 0x0001fdd6 -[CreateMessageViewController actionSheet:clickedButtonAtIndex:] (CreateMessageViewController.m:163) 8 UIKit 0x30a6cbd8-[UIActionSheet(Private)_buttonClicked:] + 256 9 核心基础 0x30256dd4 -[NSObject performSelector:withObject:withObject:] + 20 10 UIKit 0x3096e0d0-[UIApplication sendAction:to:from:forEvent:] + 128 11 UIKit 0x3096e038-[UIApplication sendAction:toTarget:fromSender:forEvent:] + 32 12 UIKit 0x3096e000-[UIControl sendAction:to:forEvent:] + 44 13 UIKit 0x3096dc58-[UIControl(内部)_sendActionsForEvents:withEvent:] + 528 14 UIKit 0x309a6e9c-[UIControl touchesEnded:withEvent:] + 452 15 UIKit 0x309a60d4-[UIWindow_sendTouchesForEvent:] + 520 16 UIKit 0x309a5464 -[UIWindow 发送事件:] + 108 17 UIKit 0x30936e3c -[UIApplication 发送事件:] + 400
任何帮助表示赞赏,谢谢。
更新:此外,即使程序崩溃,当我打开它备份时,数据已正确保存。所以 EXC_BAD_ACCESS 必须在保存至少足够远以存储在我认为的持久存储中之后发生。
如果我注释掉保存行,代码现在可以正常运行。但是在我关闭并退出后它不会保存。如果我在根视图控制器 willAppear 函数中运行保存行,它会引发相同的 EXC_BAD_ACCESS 错误。如果我进行回溯,控制台除了 EXC_BAD_ACCESS 什么都不会说:
#0 0x30011940 in objc_msgSend() #1 0x367f7d44 in -[NSKnownKeysDictionary1 dealloc] () #2 0x367f7ce0 in -[NSKnownKeysDictionary1 release] () #3 0x3687eeca in -[NSManagedObject(_NSInternalMethods) _setOriginalSnapshot__:] () #4 0x36821036 在 -[NSManagedObjectContext(_NSInternalAdditions) _clearOriginalSnapshotAndInitializeRec:] () #5 0x368205f8 在 -[NSManagedObjectContext(_NSInternalAdditions) _didSaveChanges] () #6 0x368133c2 in -[NSManagedObjectContext save:] () #7 0x0000314e in -[RootViewController viewWillAppear:] (self=0x11b560, _cmd=0x3014ecac, animated=1 '\001') at /Users/inckbmj/Desktop/iphone/Decome/Classes/RootViewController.m:85
抱歉,之前的代码格式不正确。当这个视图控制器被创建时,如果它不是一个新的“消息”,它会传递一个从 fetchedResultsController 获得的消息对象,如下所示:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
MailMessage *aMessage = (MailMessage *)[fetchedResultsController objectAtIndexPath:indexPath];
[messageView loadMessage:aMessage viewOnly:NO usingTemplate:NO];
messageView.managedObjectContext = self.managedObjectContext;
[self.navigationController pushViewController:messageView animated:YES];
}
(第一组代码来自 MessageViewController.m 文件,它是 messageView 所在的类)
只有当我将 EditorViewController 呈现为模态视图然后返回时,它才会崩溃。即使我将 textArray 和 htmlString 行(这是模态视图影响的唯一内容)更改为:
message.textArray = @"HELLO";
message.htmlString = @"HELLO";
它仍然崩溃。如果我将这两行都注释掉,但它不会崩溃。
因此,如果我呈现一个模态视图然后尝试编辑我的 NSOManagedObject 的 textArray 或 htmlString 字段,它似乎会崩溃......
这是我提出观点的地方:
- (void) touchesEnded: (NSSet *) touches withEvent: (UIEvent *) event {
if(!viewOnly) {
UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInView: txtTo];
location = [touch locationInView: webViewBody];
if(CGRectContainsPoint(webViewBody.bounds, location)) {
[editor loadTextArrayString:stringTextArray];
[self presentModalViewController:editor animated:YES];
}
}
}
我在哪里解雇它:
-(void)returnWithTextArray:(NSString *)arrayString HTML:(NSString *)html bgColor:(NSNumber *)numColor {
[self dismissModalViewControllerAnimated:YES];
self.stringTextArray = [NSString stringWithFormat:@"%@", arrayString];
self.stringHTML = [NSString stringWithFormat:@"%@", html];
self.bgColor = [NSNumber numberWithInt:[numColor intValue]];
[webViewBody loadHTMLString:self.stringHTML baseURL:[NSURL URLWithString:@""]];
}