سؤال

أحاول الكتابة إلى ملف plist باستخدام WriteTofile ، قبل أن أكتب أتحقق مما إذا كان الملف موجودًا.

هذا هو الرمز:

#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

عند تنفيذ AddContactaction ، لا أحصل على أي خطأ ، لكن البرنامج يتوقف ويأخذني إلى مصحح الأخطاء. عندما أضغط على متابعة في مصحح الأخطاء ، أحصل على:

Program received signal:  “EXC_BAD_ACCESS”.

ولكن ربما ليس من المهم.

ملاحظة: أنا جديد في برنامج Mac Programming ولا أعرف ما الذي يجب تجربته لأنني لا أحصل على رسالة خطأ تخبرني بما يحدث.

المسار إلى الملف هو:

/users/andre/documents/contacts.plist

لقد جربت هذا في وقت سابق (بنفس النتيجة) ، لكنني قرأت أنه لا يمكنك الكتابة إلا إلى مجلد المستندات:

/users/andre/desktop/nn/nstableview/build/debug/nstableview.app/contents/resources/contacts.plist

هل لدى أي شخص فكرة أو حتى تفسير لماذا يحدث هذا؟

هل كانت مفيدة؟

المحلول

أنت تقوم بتعيين FilePath مع StringByAppendingPathComponent: الطريقة. هذه الطريقة تُرجع كائنًا تلقائيًا. (يتم استخدام الكائن الذي تم صدره بعد إصداره (تلقائيًا) ، مما قد يتسبب في خطأ في الوصول السيئ.)

أعتقد أن التغيير

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

داخل

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

سوف يحل مشاكلك.

نصائح أخرى

أولاً ، أعتقد أنه لا ينبغي عليك إنشاء كائن NSFileManager. بدلاً من ذلك ، يمكنك استخدام مدير الملفات الافتراضي ، مثل هذا:

[[NSFileManager defaultManager] fileExistsAtPath: filePath];

بعد ذلك ، هل يمكنك تحديد الخط الذي ينقسم البرنامج إلى مصحح الأخطاء؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top