2010-12-07 4 views
0
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Thread" inManagedObjectContext:managedObjectContext]; 

Эта линия больше не работает (я уверен, что ее эта линия).Вывод кодовых данных после обновления до XCode + iOS 4.2

Я не могу понять, в чем проблема. Приложение отлично работает на Xcode с прошивкой 4.1 и теперь падает с этой ошибкой в ​​консоли:

2010-12-07 17:12:27.552 SMSApp[9222:207] +[ persistentStoreCoordinator]: unrecognized selector sent to class 0x5b14580 
2010-12-07 17:12:27.553 SMSApp[9222:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[ persistentStoreCoordinator]: unrecognized selector sent to class 0x5b14580' 
*** Call stack at first throw: 
(
    0 CoreFoundation      0x01547be9 __exceptionPreprocess + 185 
    1 libobjc.A.dylib      0x0169c5c2 objc_exception_throw + 47 
    2 CoreFoundation      0x015497bb +[NSObject(NSObject) doesNotRecognizeSelector:] + 187 
    3 CoreFoundation      0x014b9366 ___forwarding___ + 966 
    4 CoreFoundation      0x014b8f22 _CF_forwarding_prep_0 + 50 
    5 CoreData       0x00e6f3ca +[NSEntityDescription entityForName:inManagedObjectContext:] + 42 
    6 SMSApp        0x000046b9 -[MessagesRootViewController reloadMessages:] + 146 
    7 SMSApp        0x00004a09 -[MessagesRootViewController viewDidLoad] + 85 
    8 UIKit        0x0052265e -[UIViewController view] + 179 
    9 UIKit        0x00520a57 -[UIViewController contentScrollView] + 42 
    10 UIKit        0x00531201 -[UINavigationController _computeAndApplyScrollContentInsetDeltaForViewController:] + 48 
    11 UIKit        0x0052f831 -[UINavigationController _layoutViewController:] + 43 
    12 UIKit        0x00530b4c -[UINavigationController _startTransition:fromViewController:toViewController:] + 524 
    13 UIKit        0x0052b606 -[UINavigationController _startDeferredTransitionIfNeeded] + 266 
    14 UIKit        0x00643e01 -[UILayoutContainerView layoutSubviews] + 226 
    15 QuartzCore       0x010b4451 -[CALayer layoutSublayers] + 181 
    16 QuartzCore       0x010b417c CALayerLayoutIfNeeded + 220 
    17 QuartzCore       0x010ad37c _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 310 
    18 QuartzCore       0x010ad0d0 _ZN2CA11Transaction6commitEv + 292 
    19 UIKit        0x0047719f -[UIApplication _reportAppLaunchFinished] + 39 
    20 UIKit        0x00477659 -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 690 
    21 UIKit        0x00481db2 -[UIApplication handleEvent:withNewEvent:] + 1533 
    22 UIKit        0x0047a202 -[UIApplication sendEvent:] + 71 
    23 UIKit        0x0047f732 _UIApplicationHandleEvent + 7576 
    24 GraphicsServices     0x01b2ca36 PurpleEventCallback + 1550 
    25 CoreFoundation      0x01529064 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52 
    26 CoreFoundation      0x014896f7 __CFRunLoopDoSource1 + 215 
    27 CoreFoundation      0x01486983 __CFRunLoopRun + 979 
    28 CoreFoundation      0x01486240 CFRunLoopRunSpecific + 208 
    29 CoreFoundation      0x01486161 CFRunLoopRunInMode + 97 
    30 UIKit        0x00476fa8 -[UIApplication _run] + 636 
    31 UIKit        0x0048342e UIApplicationMain + 1160 
    32 SMSApp        0x000025c4 main + 102 
    33 SMSApp        0x00002555 start + 53 
) 
terminate called after throwing an instance of 'NSException' 

Любая идея, где эта ошибка происходит из или что является причиной его?

Чтобы сообщить вам об этом, перейдя на XCode с iOS 4.2, некоторые из файлов будут удалены из моего проекта. Я не знаю, почему это было, было ли это потому, что они были связаны файлами, а не в папке, которую я не знаю.

Любые идеи?

Благодаря

// EDIT

Этот метод в AppDelegate:

- (NSManagedObjectContext *)managedObjectContext { 

    if (managedObjectContext_ != nil) { 
     return managedObjectContext_; 
    } 

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
    if (coordinator != nil) { 
     managedObjectContext_ = [[NSManagedObjectContext alloc] init]; 
     [managedObjectContext_ setPersistentStoreCoordinator:coordinator]; 
    } 
    return managedObjectContext_; 
} 

// EDIT СНОВА

- (void)reloadMessages:(NSNotification *)notification { 
    NSLog(@"RECIEVED NEW MESSAGES TO MessagesRootViewController"); 

    NSLog(@"%@",managedObjectContext); 

    // we need to get the threads from the database... 
    NSFetchRequest *theReq = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Thread" inManagedObjectContext:self.managedObjectContext]; 
    [theReq setEntity:entity]; 

    threads = [NSArray arrayWithArray:[managedObjectContext executeFetchRequest:theReq error:nil]]; 

    [self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO]; 

    if(notification != nil){ // if its been caused by a notification 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"New Message" message:@"A new message has been received" delegate:nil cancelButtonTitle:@"Thanks" otherButtonTitles:nil]; 
     [alert performSelectorOnMainThread:@selector(show) withObject:nil waitUntilDone:NO]; 
     [alert release]; 
    } 
} 

// EDIT 3

Если Я положил t его код в applicationDidFinishLoading моего делегата приложения работает отлично!

NSFetchRequest *theReq = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *theEntity = [NSEntityDescription entityForName:@"Thread" inManagedObjectContext:self.managedObjectContext]; 
    [theReq setEntity:theEntity]; 

    NSArray *theThreads = [NSArray arrayWithArray:[self.managedObjectContext executeFetchRequest:theReq error:nil]]; 
+0

Вы пытались сделать чистую, а затем перестроенную? – 2010-12-07 17:25:33

+0

Были ли они исходными файлами или некоторыми другими файлами? – BoltClock 2010-12-07 17:28:37

+0

чистый не работает. Болтлок: что ты имеешь в виду? Файлы, которые были удалены, были исходными файлами. :) .h и .ms, но они были из другой структуры, которую я импортировал, а некоторые были только связаны (я думал, что их было больше, но было только два, которые были удалены). – 2010-12-07 17:35:26

ответ

1

После того, как вы быстро просмотрели свой код, я думаю, что нашел пару частей, которые нуждались в внимании. Постараюсь и разбить их ниже:

SMSAppAppDelegate

1) Обратите внимание на то, что в вашем файле интерфейса, вы объявляете переменные CoreData с подчеркиванием в конце имени переменной. Затем вы создаете свойства для каждого из ivar без символ подчеркивания.Это все хорошо до тех пор, как вы @synthesize их делают правильное назначение, которое, кажется, отсутствуют в реализации:

@synthesize managedObjectContext=managedObjectContext_; 
@synthesize managedObjectModel=managedObjectModel_; 
@synthesize persistentStoreCoordinator=persistentStoreCoordinator_; 

DownloadContacts

1) В этом классе вы вызываете managedObjectContext напрямую через переменную. Я бы не рекомендовал этого, но это не ваша настоящая проблема. Обратите внимание, что вы освобождаете managedObjectContext на dealloc, даже если у вас нет права собственности!

2) Что бы я сделал в этом случае, это объявление свойства для контекста, и всегда доступ к нему через собственность. Кроме того, если вы переименуете свою переменную экземпляра для включения подчеркивания в конце, вы минимизируете свои шансы получить доступ к ней напрямую (т. Е. Без использования self.), И это облегчит вам поиск того, где в этом классе вы фактически это делаете (есть несколько мест из памяти).

Так что в вашем файле интерфейса, переименовывать managedObjectContext Ивар и объявить свойство:

NSManagedObjectContext *managedObjectContext_; 
... 
@property (nonatomic, retain) NSManagedObjectContext managedObjectContext; 

И не забудьте сделать задание на @sythesize и выпустить на dealloc, так как вы используете сохраняют свойство:

@synthesize managedObjectContext=managedObjectContext_; 
... 
[managedObjectContext_ release]; 

Затем, если вы пытаетесь скомпилировать вы получите два или три ошибки непризнанного переменной экземпляра в котором вы должны пойти и изменить его на self.managedObjectContext

MessagesRootViewController

И, наконец, я рекомендую вам пройти через тот же процесс в вашем MessagesRootViewController, но это нужно еще работать нормально, как это!

Посмотрите, как вы пойдете и дайте мне знать, если какой-либо из вышеперечисленных вопросов не ясен! Cheers, Rog

0

Я предполагаю, что вы делаете что-то вроде:

[ClassName persistentStoreCoordinator] 

Убедитесь ClassName определена и имеет метод persistentStoreCoordinator класса. Возможно, файл, который сделал эти вещи, был удален?

Matt

+0

Хм ... Я посмотрю. Программа не жалуется на то, что не сможет найти определенные файлы, но вы можете быть на что-то. Я пойду и посмотрю. :) – 2010-12-07 17:38:52

0

Ваша база данных может быть поврежден, попробуйте перезагрузить IOS симулятор , нажав на IOS Simulator> Сброс содержимого и настроек.

Редактировать: Похоже, вы пытаетесь вызвать селектор, который не существует. Попытайтесь выяснить, какие файлы были удалены, поскольку кажется, что у вас есть метод, который вызывается, который не может быть найден во время выполнения. Может быть, ваши основные классы данных были стерты?

Смежные вопросы