Question

Je suis en train d'écrire dans un fichier plist writeToFile, avant d'écrire, je vérifie si le fichier existe.

Voici le code:

#import "WindowController.h"

@implementation WindowController

@synthesize contacts;

NSString *filePath;
NSFileManager *fileManager;

- (IBAction)addContactAction:(id)sender {

    NSDictionary *dict =[NSDictionary dictionaryWithObjectsAndKeys:
                         [txtFirstName stringValue], @"firstName",
                         [txtLastName stringValue], @"lastName",
                         [txtPhoneNumber stringValue], @"phoneNumber",
                         nil];

    [arrayContacts addObject:dict];

    [self updateFile];
}

- (void)awakeFromNib {
    NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    filePath    = [rootPath stringByAppendingPathComponent:@"Contacts.plist"];
    fileManager = [NSFileManager defaultManager];

    contacts = [[NSMutableArray alloc] init];

    if ([fileManager fileExistsAtPath:filePath]) {

        NSMutableArray *contactsFile = [[NSMutableArray alloc] initWithContentsOfFile:filePath];
        for (id contact in contactsFile) {
            [arrayContacts addObject:contact];
        }
    }
}

- (void) updateFile {
    if ( ![fileManager fileExistsAtPath:filePath] || [fileManager isWritableFileAtPath:filePath]) {
        [[arrayContacts arrangedObjects] writeToFile:filePath atomically:YES];
    }
}

@end

Quand le addContactAction est exécuté, je ne reçois pas d'erreur mais le programme arrête et il me amène au débogueur. Quand je presse continue dans le débogueur je reçois:

Program received signal:  “EXC_BAD_ACCESS”.

Mais c'est probablement pas important.

PS:. Je suis nouveau à la programmation mac et je ne sais pas quoi d'autre pour essayer puisque je ne suis pas un message d'erreur qui me dit ce qui va mal

Le chemin du fichier est:

  

/Users/andre/Documents/Contacts.plist

je l'ai déjà essayé ceci (avec le même résultat), mais je lis que vous ne pouvez écrire dans le dossier de documents:

  

/Users/andre/Desktop/NN/NSTableView/build/Debug/NSTableView.app/Contents/Resources/Contacts.plist

Est-ce que quelqu'un a une idée ou même une explication pourquoi cela se produit?

Était-ce utile?

La solution

Vous définissez filePath avec la stringByAppendingPathComponent: méthode. Cette méthode retourne un objet autoreleased. (Objet autoreleased est utilisé après qu'il a été (automatiquement) a publié, ce qui pourrait provoquer l'erreur mauvaise d'accès.)

Je pense que le changement

[rootPath stringByAppendingPathComponent:@"Contacts.plist"];

dans

[[rootPath stringByAppendingPathComponent:@"Contacts.plist"] retain];

résoudra vos problèmes.

Autres conseils

D'abord, je pense que vous ne devriez pas instancier un objet NSFileManager. Au lieu de cela, vous utilisez le gestionnaire de fichiers par défaut, comme ceci:

[[NSFileManager defaultManager] fileExistsAtPath: filePath];

Alors, pourriez-vous nous préciser à quelle ligne programme se brise dans le débogueur?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top