سؤال

كل شيء يعمل بشكل جيد حتى أسمي saveFile الطريقة (المبينة أدناه) لكتابة الملف مرة أخرى إلى القرص، حيث تعطل. ما الخطأ الذي افعله؟

هذا هو جزء من بلدي viewDidLoad الطريقة التي افتح فيها الملف، الذي يعمل بشكل جيد.

//Get The Path
[self initPath];

dictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:accountsFilePath];      

if (accountsArray == nil) {
    accountsArray = [[[NSMutableArray alloc]init] autorelease];
}

if (countArray == nil) {     
    countArray = [[[NSMutableArray alloc]init] autorelease];
}

countArray = [dictionary objectForKey:@"count"];
accountsArray = [dictionary objectForKey:@"username"];

ثم قمت بتحميله في طاولة. ثم أضف بعض العناصر الجديدة إليها، والتي تعمل بشكل جيد. ثم اتصلت بهذه الطريقة لحفظها وتعطل:

-(void)saveFile {
    [dictionary setObject:accountsArray forKey:@"username"];
    [dictionary setObject:countArray forKey:@"count"];
    [dictionary writeToFile:accountsFilePath atomically:YES];   
}
هل كانت مفيدة؟

المحلول

// ماذا لو لم يتم العثور على المسار، الملف غير تحميل وفي الدعارة قاموس هو nil

dictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:accountsFilePath];

// المرة الأولى التي تقوم فيها بإنشاء حسابات، Countarray

if (accountsArray == nil) {
    accountsArray = [[[NSMutableArray alloc]init] autorelease]; }

if (countArray == nil) {     
    countArray = [[[NSMutableArray alloc]init] autorelease]; }

// مهلا لماذا قمت بتعيين RockAssaray إلى واحدة جديدة مرة أخرى، ماذا عن القديم الذي تابعه فقط؟

// إذا كان القاموس لا شيء، سيكون countarray nil أيضا

countArray = [dictionary objectForKey:@"count"];
accountsArray = [dictionary objectForKey:@"username"];

//// //// ////////////////////////////////////////////////////////////////

ما هي رسالة تحطم الطائرة الخاصة بك؟

ما هي حساباتك

هل تستطيع قراءة ملف قاموس؟

شيء واحد قد ترغب في معرفته

WritetoFile لن تقوم بإنشاء مجلد جديد لك

لذا فإن جميع المجلد في RociousFilepath أمر لا بد منه.

وإلا فقد ترغب في إنشاء هذا المجلد باستخدام NSFILEMANAGER

نصائح أخرى

أنت التلقائي countArray و accountsArray فقط بعد تهيئة لهم. قد يتم إصدارها بالفعل عند محاولة حفظها. حاول التعليق autorelease لكلا منهم (وتذكر إطلاق سراحهم في مكان ما، ربما في dealloc طريقة).

هل كل ما تبذلونه من المتغيرات في النطاق؟ أفترض أن الحسابات في القاموس ومتغيرات فئة؟ إن لم يكن قد يموتون في نهاية DiewDidLoad.

الشيء الآخر الذي قد يعضك هو قدرة قاموسك صغير جدا، أو أن iPhone لا يحبك باستخدام طريقة SetObject للكتابة فوق أزواج المفتاح / القيمة مثل هذا. ربما حاول استدعاء reviewObjectForkey: ثم قم بإضافته مرة أخرى كما لديك أعلاه؟

ربما قمت بالفعل بذلك، لكنني أود أن أفحص القاموس والمحطات في GDB أو باستخدام NSLOG مباشرة قبل WritetoFile: Atomically: Call.

قد ترغب أيضا في مشاركة رمز أكثر محاطا لإظهار ما يجري فيما يتعلق بهذا القاموس.

لقد كنت أستخدم NSZombie مع الكثير من النجاح لتصحيح الأعطال العشوائية أيضا.

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