تواجه مشكلة في نسخ البيانات إلى صفيف قابل للتغيير
-
01-10-2019 - |
سؤال
أستمر في الحصول على الخطأ "إنهاء التطبيق بسبب استثناء غير معروف" 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;