nsmutabletictionary removeObjectForKey رمي ex_bad_access لـ var لم يتم إصداره
-
20-09-2019 - |
سؤال
لدي بلايست. يحتوي على عشرات المفاتيح ، ولكل منها عناصر 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])
.