Iphone de Base de Données s'écraser sur Enregistrer
Je suis en train d'écrire une application Iphone à l'aide de Données de Base et j'ai un EXC_BAD_ACCESS
erreur lors de l' [managedObjectContext enregistrer:&&erreur] ligne de code. Ce problème se produit uniquement après que j'ai modifier certains champs. Plus précisément mon entité a deux champs de type chaîne (sur environ 10 domaines), que les valeurs à partir d'un retour d'un modal-vue-contrôleur (comme un éditeur de texte). Le crash aussi ne survient qu'après ces champs sont modifiés, la première fois j'ai mis une valeur en elle fonctionne très bien.
La raison pour laquelle j'ai de la chaîne avec le format de constructeurs avec juste des chaînes est parce que j'essayais de copier construire... ne sais pas si cela se fait automatiquement? La pensée peut-être conserver/libération des messages à partir de ces chaînes (les deux sont de la modal-vue-contrôleur), publié sur le licenciement de l'modal-vue-contrôleur ou quelque chose. Ne crois pas, mais parce que cela ne fonctionne toujours pas.
Voici la section de code qui plante:
[ÉDITÉ]
- (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];
}
}
Et voici le rapport de crash:
Type d'Exception: EXC_BAD_ACCESS (SIGBUS) Codes d'Exception: KERN_PROTECTION_FAILURE à 0x00000015 S'Est Écrasé Fil: 0 Thread 0 Écrasé: 0 libobjc.Un.dylib 0x30011940 objc_msgSend + 20 1 CoreData 0x367f7d3e -[NSKnownKeysDictionary1 dealloc] + 82 2 CoreData 0x367f7cda -[NSKnownKeysDictionary1 de presse] + 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 enregistrer:] + 412 7 Decome 0x0001fdd6 -[CreateMessageViewController actionSheet:clickedButtonAtIndex:] (CreateMessageViewController.m:163) 8 UIKit 0x30a6cbd8 -[UIActionSheet(Privé) _buttonClicked:] + 256 9 CoreFoundation 0x30256dd4 -[NSObject performSelector:withObject:withObject:] + 20 10 UIKit 0x3096e0d0 -[UIApplication sendAction:à:de:forEvent:] + 128 11 UIKit 0x3096e038 -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 32 12 UIKit 0x3096e000 -[UIControl sendAction:: forEvent:] + 44 13 UIKit 0x3096dc58 -[UIControl(Interne) _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
Toute aide est appréciée, Merci.
Mise à JOUR: Même, même si le programme se bloque, quand je l'ouvre sauvegarder les données ont été correctement sauvegardés. Ainsi, le EXC_BAD_ACCESS doit se produire après l'enregistrer a obtenu au moins assez loin pour stocker dans le magasin persistant, je pense.
Si j'en commentaire le enregistrer en ligne, le code fonctionne très bien maintenant. Mais il ne suffit pas à sauver après que j'ai fermer et quitter. Si je lance le enregistrer en ligne dans ma Vue de la Racine de Contrôleurs willAppear fonction, il lance le même EXC_BAD_ACCESS erreur. La console ne veut rien dire d'autre que EXC_BAD_ACCESS
si je fais un backtrace j'obtiens :
#0 0x30011940 dans objc_msgSend () #1 0x367f7d44 en[NSKnownKeysDictionary1 dealloc] () #2 0x367f7ce0 en[NSKnownKeysDictionary1 release] () #3 0x3687eeca en[NSManagedObject(_NSInternalMethods) _setOriginalSnapshot__:] () #4 0x36821036 en[NSManagedObjectContext(_NSInternalAdditions) _clearOriginalSnapshotAndInitializerec:] () #5 0x368205f8 en[NSManagedObjectContext(_NSInternalAdditions) _didSaveChanges] () #6 0x368133c2 en[NSManagedObjectContext enregistrer:] () #7 0x0000314e en[RootViewController viewWillAppear:] (auto=0x11b560, _cmd=0x3014ecac, animé=1 '#0 0x30011940 dans objc_msgSend () #1 0x367f7d44 en[NSKnownKeysDictionary1 dealloc] () #2 0x367f7ce0 en[NSKnownKeysDictionary1 release] () #3 0x3687eeca en[NSManagedObject(_NSInternalMethods) _setOriginalSnapshot__:] () #4 0x36821036 en[NSManagedObjectContext(_NSInternalAdditions) _clearOriginalSnapshotAndInitializerec:] () #5 0x368205f8 en[NSManagedObjectContext(_NSInternalAdditions) _didSaveChanges] () #6 0x368133c2 en[NSManagedObjectContext enregistrer:] () #7 0x0000314e en[RootViewController viewWillAppear:] (auto=0x11b560, _cmd=0x3014ecac, animé=1 '\001') dans /Utilisateurs/inckbmj/Desktop/iphone/Decome/Classes/RootViewController.m:851') dans /Utilisateurs/inckbmj/Desktop/iphone/Decome/Classes/RootViewController.m:85
Désolé, le code n'est pas correctement formaté avant. Lors de ce point de vue contrôleur est créé si il n'est pas un nouveau "message" il est passé d'un message objet obtenu à partir d'un fetchedResultsController comme suit:
- (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];
}
(le premier jeu de code de la MessageViewController.m fichier qui est la classe qui messsageView est)
Il ne se bloque si je présente mon EditorViewController comme un modal de la vue et de revenir ensuite.
Même si je change l'textArray et htmlString lignes (qui sont les seules choses que les modaux vue affecte):
message.textArray = @"HELLO";
message.htmlString = @"HELLO";
il se bloque toujours. Si j'en commentaire les deux lignes, mais il ne tombe pas en panne.
De sorte qu'il semble qu'il se bloque si je présente une vue modal et puis essayez de modifier la textArray ou htmlString champs de mon NSOManagedObject...
Est ici où je présente le point de vue:
- (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];
}
}
}
et où je le rejeter:
-(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:@""]];
}
Il ne semble pas être causée par l'un des champs, je pense que ça doit être dû à la présentation de la modale de vue... Mais je n'ai aucune idée pourquoi. Tout ce que je suis en train de faire est de présenter le point de vue, et ensuite de le rejeter...
Je pense que vous pourriez être à la recherche à la mauvaise zone. 1. Commentaire de TOUTES les données de base enregistrer le code ci-dessus. ou il suffit d'ajouter un "retour" appel au très haut, donc ce code ne s'exécute. TEST de Crash. 2. Si le plantage ne se produit pas, OK, il doit être dans la base de données. Tout faire, mais ne pas appeler la fonction save, depuis quelques lignes. 3. Nous montrer l'ensemble du lot de code pour cette fonction que je me demande comment vous remplissez le message si il n'est pas nul. 4. Qu'est-ce que la console en disant. Il devrait vous donner un peu plus de détails sur ce qui s'est passé.
Édité mon post pour y inclure plus de code. Il ne plante pas si j'en commentaire le sauver. J'exécute le même code si le message n'est pas nul, il serait juste de modifier l'objet MailMessage j'ai passé lorsque le contrôleur a été poussé. Toutes les console dit est EXC_BAD_ACCESS.
OriginalL'auteur kiyoshi | 2009-08-05
Vous devez vous connecter pour publier un commentaire.
Vous ne sont garantis qu'à conserver l'accès à un objet géré à partir du contexte, tant qu'un changement est en attente d'un objet (insert, update, delete). Dès que vous effectuez un appel à enregistrer: vous pouvez perdre votre référence à l'objet géré.
Alors que vous avez arrêté l'obtention de l'erreur lorsque vous définissez setRetainsRegisteredObjects:OUI, vous avez introduit un mémoire de gestion de la question, comme vous le paramètre de l'objet géré de vie, dépend de la durée de vie de l'objet géré contexte. Si vous êtes de passage à votre contexte autour tout au long de votre application, cela pourrait devenir assez grande si vous avez une grande hiérarchie de l'objet.
Vous pouvez en lire plus dans l'Apple docs ici: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdMemory.html.
OriginalL'auteur Tony Lenzi
Résolu le problème mais je ne suis pas sûr que je suis à traiter la cause réelle. L'erreur a été éliminée lorsque j'ai ajouté cette ligne:
À l'endroit où je créer le managedObjectContext. Donc je suppose qu'il avait à faire à retenir compte. Je suppose que peut-être les variables d'instance sont libérés partiellement, temporairement ou de quelque chose quand modal points de vue sont présentés? Je ne sais pas. En tout cas, cette erreur a été éliminée de la le programme fonctionne très bien maintenant.
Même si cela peut résoudre votre problème, votre raisonnement est un peu défectueux. Ma réponse ci-dessous explique pourquoi: est à l'origine de votre problème et de points à la Pomme docs.
Salut. Le non enregistrées objets gérés sont libérés lorsque vous appelez enregistrer. Les nouveaux objets gérés doivent être chargés à partir de votre récupère les résultats du contrôleur.
OriginalL'auteur kiyoshi
Juste pour aider les autres ayant le même problème, et le renforcement de Steff la réponse ci-dessus, la cause probable de cette erreur est que vous essayez de libérer un NSManagedObject.
OriginalL'auteur Rog
J'ai vu beaucoup de drôles de comportements avec CoreData sur iPhone qui ont été résolus en réinitialisant le contenu et les paramètres dans le simulateur d'iPhone.
OriginalL'auteur Michael Sharek
Je sais que c'est un oldie, mais j'ai eu le même problème donc j'ai pensé ajouter mon tuppence comment j'ai résolu le problème, le mien a été causé par manuellement libérant de l'objet géré au sein de la modale de vue, j'ai enlevé les appels de libération et tout fonctionne très bien 🙂 d'après les docs que vous ne devriez pas essayer manuellement et la libération des objets gérés de toute façon que le contexte va s'occuper de tout cela. C'est mon expérience de toute façon, la recherche par le biais de votre code pour plus libéré et de valeurs.
OriginalL'auteur Steff
Vous devez définir la FRC cache à néant
OriginalL'auteur Greg