خطأ أثناء التحقق مما إذا كان هناك ملف
-
20-09-2019 - |
سؤال
أحاول الكتابة إلى ملف 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];
بعد ذلك ، هل يمكنك تحديد الخط الذي ينقسم البرنامج إلى مصحح الأخطاء؟