コアデータを使用してiPhoneアプリケーションを作成していますが、[managedObjectContext保存:& &エラー]コード行中にEXC_BAD_ACCESS
エラーが発生します。このクラッシュは、特定のフィールドを変更した後にのみ発生します。具体的には、私のエンティティは、(テキストエディタのような)モーダルビューコントローラの戻り値から値を取得する2つの文字列フィールド(約10フィールドのうち)を持っています。クラッシュは、これらのフィールドが編集された後にのみ発生します。最初に値を入れたときに正常に動作します。Iphoneコアのデータが保存時にクラッシュする
フォーマットコンストラクタを文字列で使用している理由は、コンストラクタをコピーしようとしていたためです...それが自動的に起こるかどうかはわかりません。モーダル・ビュー・コントローラーなどの解雇時にリリースされていた文字列(これらの2つはモーダル・ビュー・コントローラーのもの)からメッセージを保持/解放することができます。それはまだ動作しないためだと思う。
ここでクラッシュしたコードセクションです:、
Exception Type: EXC_BAD_ACCESS (SIGBUS) Exception Codes: KERN_PROTECTION_FAILURE at 0x00000015 Crashed Thread: 0 Thread 0 Crashed: 0 libobjc.A.dylib 0x30011940 objc_msgSend + 20 1 CoreData 0x367f7d3e -[NSKnownKeysDictionary1 dealloc] + 82 2 CoreData 0x367f7cda -[NSKnownKeysDictionary1 release] + 34 3 CoreData 0x3687eec4 -[NSManagedObject(_NSInternalMethods) _setOriginalSnapshot__:] + 40 4 CoreData 0x36821030 -[NSManagedObjectContext(_NSInternalAdditions) _clearOriginalSnapshotAndInitializeRec:] + 16 5 CoreData 0x368205f2 -[NSManagedObjectContext(_NSInternalAdditions) _didSaveChanges] + 958 6 CoreData 0x368133bc -[NSManagedObjectContext save:] + 412 7 Decome 0x0001fdd6 -[CreateMessageViewController actionSheet:clickedButtonAtIndex:] (CreateMessageViewController.m:163) 8 UIKit 0x30a6cbd8 -[UIActionSheet(Private) _buttonClicked:] + 256 9 CoreFoundation 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(Internal) _sendActionsForEvents:withEvent:] + 528 14 UIKit 0x309a6e9c -[UIControl touchesEnded:withEvent:] + 452 15 UIKit 0x309a60d4 -[UIWindow _sendTouchesForEvent:] + 520 16 UIKit 0x309a5464 -[UIWindow sendEvent:] + 108 17 UIKit 0x30936e3c -[UIApplication sendEvent:] + 400
すべてのヘルプは高く評価されてありがとう:[EDITED]
- (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は、少なくとも永続的ストアに格納するのに十分なだけ保存が得られた後でなければなりません。
私が保存行をコメントアウトすると、コードは正常に実行されます。しかし、私は終了して終了した後は保存されません。ルートビューコントローラ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 in -[NSManagedObjectContext(_NSInternalAdditions) _clearOriginalSnapshotAndInitializeRec:]() #5 0x368205f8 in -[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
申し訳ありませんが、コードが正しく前にフォーマットされていませんでした。
- (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ファイルからのものである:新しい「メッセージ」とは、そうのようなfetchedResultsControllerから得られたメッセージオブジェクトが渡されない場合は、このビューコントローラが作成されるときにmesssageViewがあるクラス)
私は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:@""]];
}
ワン変更して保存した後でクラッシュの原因となったものを確認します。 – digdog
それはフィールドのいずれかによって引き起こされているようではないようですが、私はモーダルビューを提示する必要があると思います...しかし、私は理由を知りません。 私がやっていることは、その展望を提示して、それを却下することです... – kiyoshi
あなたは間違った領域を見ているかもしれないと思います。 1.上記のすべてのコアデータセーブコードをコメントアウトします。まさにトップに「リターン」コールを追加するだけで、このコードは決して実行されません。クラッシュのテスト。 2.クラッシュが発生しない場合は、OKをコアデータに含める必要があります。すべてを行いますが、最後の数行を保存する関数を呼び出しません。 3.この関数のためのコードをたくさん表示します.Nilでなければどのようにメッセージを生成しているのでしょうか? 4.コンソールとは何ですか。何が起こったかについての詳細をいくつか教えてください。 –