سؤال

أستمر في الحصول على الخطأ "إنهاء التطبيق بسبب استثناء غير معروف" nsinvalidargumentexception "، السبب:"+[MainViewController MinimalForminContext:]: تم إرسال محدد غير معترف به إلى الفصل "من هذا السطر من الكود: NSLOG (@" الوصول إلى كيانات منجم محددة ") ؛

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Mine" inManagedObjectContext:managedObjectContext];   
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];   
NSError *error = nil;
[request setEntity:entity];  
NSPredicate *predicate;
NSPredicate *metalFilter;

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *region = [defaults stringForKey:@"mineArray"];

if([region isEqualToString:@"Butte & Plumas"])
{
    predicate = [NSPredicate predicateWithFormat:@"(county Contains %@)  OR (county Contains %@)",@"Butte",@"Plumas"];
}
else if([region isEqualToString:@"Sutter, Yuba, & Sierra"])
{
    predicate = [NSPredicate predicateWithFormat:@"(county Contains %@)  OR (county Contains %@) OR (county Contains %@)",@"Sutter",@"Yuba",@"Sierra"];
}
else if([region isEqualToString:@"Nevada & Placer"])
{
    predicate = [NSPredicate predicateWithFormat:@"(county Contains %@)  OR (county Contains %@)",@"Nevada",@"Placer"];
}
else if([region isEqualToString:@"Sacramento & El Dorado"])
{
    predicate = [NSPredicate predicateWithFormat:@"(county Contains %@)  OR (county Contains %@)",@"Sacramento",@"El Dorado"];
}
else if([region isEqualToString:@"San Joaquin, Amador, & Calaveras"])
{
    predicate = [NSPredicate predicateWithFormat:@"(county Contains %@)  OR (county Contains %@) OR (county Contains%@)",@"San Joaquin",@"Amador", @"Calaveras"];
}
else if([region isEqualToString:@"Tuolumne & Stanislaus"])
{
    predicate = [NSPredicate predicateWithFormat:@"(county Contains %@)  OR (county Contains %@)",@"Tuolumne",@"Stanislaus"];
}
else if([region isEqualToString:@"Merced, Mariposa, & Madera"])
{
    predicate = [NSPredicate predicateWithFormat:@"(county Contains %@) OR (county Contains %@) OR (county Contains %@)",@"Merced",@"Mariposa",@"Madera"];
}

[request setPredicate:predicate];
mArray = [[NSMutableArray alloc] init];
mArray = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];

باستخدام مصحح الأخطاء ، لقد ضاقت الخطأ كما يحدث في:

mArray = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];

كيف يمكنني حل هذه المشكلة؟

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

المحلول

من المحتمل أن يكون خطأ الاحتفاظ/الإفراج. قم بـ "بناء وتحليل" في Xcode ، وتحسين الكود الخاص بك لإزالة جميع التحذيرات.

إليكم أشياء لاحظتها:

mArray = [[NSMutableArray alloc] init];
mArray = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];

هذان الخطان سيئان للغاية. ماهو لك mArray؟ يفعل m تمثل member, ، أو mutable؟ إذا كان متغيرًا عضوًا ، فلا يجب عليك فقط تعيين مجموعة جديدة لذلك كما في

// mArray points to an array at this time, say X
mArray = [[NSMutableArray alloc] init];
// at this point, mArray points to an array Y created by alloc init. X is lost! 

علاوة على ذلك ، إذا قمت بتعيين ملف mutableCopy كما فعلت،

mArray = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
// at this point, mArray points to an array Z created by mutableCopy. Y is lost, too!

لاحظ أنه في Objective-C ، فإن المتغيرات التي تراها على الكود المصدر هي مجرد مؤشر ، وليس الكائن نفسه. إذا قمت بتعيين شيء ما لمتغير ، فإنه لا يجعل الكائن يؤدي عملية التعيين ، لكنه يغير المؤشر فقط للإشارة إلى شيء مختلف.

حقيقة أن لديك هذه الخطوط تشير إلى أن لديك أشياء مماثلة في أماكن أخرى مختلفة ؛ أي منها يمكن أن يؤدي في النهاية إلى الخطأ الذي تواجهه. لذلك تحتاج إلى التعامل معهم واحدا تلو الآخر. حظا طيبا وفقك الله!

نقطة أخرى: عندما تقوم بإعداد المتغير predicate, ، سلسلة من if أوراق الجمل predicate غير محدد إذا region لا يطابق أي من الخيارات التي أدرجتها. هذا أمر خطير للغاية ، لأنه في الهدف-C ، الخط

 NSPredicate* predicate;

يفعل ليس تهيئة predicate أن تكون nil. لذلك من الممكن ذلك

[request setPredicate:predicate];

سوف ضبط القمامة على predicate من requrest. يجب عليك تغييره إلى

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