2009-08-05 10 views
14

コアデータを使用して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:@""]]; 
} 
+0

ワン変更して保存した後でクラッシュの原因となったものを確認します。 – digdog

+0

それはフィールドのいずれかによって引き起こされているようではないようですが、私はモーダルビューを提示する必要があると思います...しかし、私は理由を知りません。 私がやっていることは、その展望を提示して、それを却下することです... – kiyoshi

+0

あなたは間違った領域を見ているかもしれないと思います。 1.上記のすべてのコアデータセーブコードをコメントアウトします。まさにトップに「リターン」コールを追加するだけで、このコードは決して実行されません。クラッシュのテスト。 2.クラッシュが発生しない場合は、OKをコアデータに含める必要があります。すべてを行いますが、最後の数行を保存する関数を呼び出しません。 3.この関数のためのコードをたくさん表示します.Nilでなければどのようにメッセージを生成しているのでしょうか? 4.コンソールとは何ですか。何が起こったかについての詳細をいくつか教えてください。 –

答えて

8

私は実際の根本的な原因に対処しているのか分かりませんが、問題を解決しました。この行を追加するとエラーが解消されました。

[managedObjectContext setRetainsRegisteredObjects:YES]; 

ToここではmanagedObjectContextを作成します。だから私はそれが保持カウントと関係していたと思います。モーダルビューが表示されたときに、インスタンス変数が部分的にまたは一時的に、あるいは何かがリリースされるかもしれないと思いますか?知りません。いずれにしても、このエラーは解消され、プログラムは正常に動作します。

+0

私は同様の問題を抱えています - ここに含まれているディレクティブでも修正されています。 –

+1

これで問題が解決する可能性がありますが、あなたの推論には多少の欠陥があります。以下の私の答えは、保存が問題を引き起こしている理由を説明しており、アップルのドキュメントを指しています。 –

+0

こんにちは。 saveを呼び出すと、保存されていない管理対象オブジェクトが解放されます。新しい管理対象オブジェクトは、フェッチ結果コントローラからロードする必要があります。 – stephen

0

私はコンテンツと設定をリセットすることで解決されたiPhone上でCoreDataと多くの面白い行動を見てきましたiPhoneシミュレータで。

+0

しかし、iPod touchでそれを実行していますが、コンテンツを無駄にリセットしようとしました:(。 – kiyoshi

0

私はこれが古いですが、同じ問題があったので、問題を解決する方法について私の魅力を追加したいと思っていました。私は手動で管理対象オブジェクトをモーダルビューで解放し、呼び出しとすべてが正常に動作しています:)ドキュメントによると、管理されたオブジェクトを手動で試してみるべきではありません。とにかくそれは私の経験です。あなたのコードから過剰な値を探してください。

0

あなただけの他の人が同じ問題を抱えて、上記ステフの応答を強化を支援するためにはnil

4

にFRCキャッシュを設定する必要があり、このエラーの原因は、あなたがNSManagedObjectを解放しようとしているということです。

22

変更がそのオブジェクトに対して保留中(挿入、更新、削除)されている限り、コンテキストからの管理オブジェクトへのアクセスを保持することのみが保証されます。 save:を呼び出すとすぐに、管理対象オブジェクトへの参照が失われる可能性があります。

setRetainsRegisteredObjects:YESを設定したときにエラーが表示されなくなりましたが、管理対象オブジェクトの有効期間を管理対象オブジェクトコンテキストの存続期間に応じて設定するため、メモリ管理の問題が発生している可能性があります。アプリ全体でコンテキストを渡している場合は、オブジェクトの階層が大きい場合は、かなり大きくなる可能性があります。

詳しくはAppleのdocs http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdMemory.htmlをご覧ください。

0

私は、上記の例では、オブジェクトをフェッチすることを確認することで同様の問題を解決しそうしている:たぶんあなたが最初にあなたの属性の変化の一部をコメントアウトし、それらを試すことができます

if (message == nil) { 
    message = [NSEntityDescription insertNewObjectForEntityForName:@"MailMessage" inManagedObjectContext:self.managedObjectContext]; 
} else { 
    NSError *error = nil; 
    message = (MailMessage *)[managedObjectContext existingObjectWithID:[message objectID] error:&error]; 
} 
関連する問題