سؤال

لدي بلايست. يحتوي على عشرات المفاتيح ، ولكل منها عناصر nsmutablearray:

...
<key>KeyName1</key>
<array>
    <string>String1</string>
    <string>String2</string>
    <string>String3</string>
</array>

<key>KeyName2</key>
<array>
    <string>String1</string>
    <string>String2</string>
    <string>String3</string>
</array>
...

أحتاج إلى إزالة "String1" لجميع المفاتيح. هذه هي الوظيفة التي كتبتها:

void DeleteString(NSString *StringToDelete){
NSMutableDictionary *item=nil;  

item = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];   

for (id obj in item){
    NSString *removeThisObject=(NSString *)obj;
    NSArray *ObjectArray = [item objectForKey:obj];

    for (int i = 0; i< [ObjectArray count]; i++){
        NSString *objectString = [ObjectArray objectAtIndex:i];

        if([objectString isEqualToString:StringToDelete]){              
            NSLog(@"Remove This from Item Dictionary: %@",removeThisObject);

            [item removeObjectForKey:obj];          
        }
    }

}
[item writeToFile:filePath atomically: YES];
[item release]; 

}

اعتقدت أنه سيكون من الأسهل إزالة المفتاح بالكامل إذا كان يتضمن قيمة لا أريدها ، ولكن الخط: [العنصر removeObjForKey: OBJ] يلقي exc_bad_access.

هذا ليس منطقيًا بالنسبة لي لأنني ، كما أفهمها تعني exc_bad_access أنه تم إرسال رسالة إلى طريقة تم إصدارها.

هنا ، "العنصر" لم يتم إصداره؟ ليس لدي خطأ في إطلاق "عنصر" فقط أقل من بضعة أسطر.

ما الذي يجري هنا؟ هل هناك طريقة أفضل لإزالة "String1" من كلا المفتاحين؟

شكرًا.

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

المحلول

هذا ليس بسبب item لم يتم إصداره ، ولكن item غير قابل للتغيير.

داخل حلقة من أجل الوصول ، لا يمكن تغيير التكرار الذي يتم اجتيازه. إذا قمت بذلك ، فسوف يرمي البرنامج استثناء تعداد متحور.

يمكنك

  • اجمع كل شيء obj في صفيف منفصل ، ثم -removeObjectsForKeys: في نهاية الحلقة ؛ أو
  • تكرار على نسخة من مفاتيح العناصر. خاصة، for (id obj in [item allKeys]).
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top