NSEntityDescription *entity = [NSEntityDescription entityForName:@"Thread" inManagedObjectContext:managedObjectContext];
这条线似乎不再起作用了(我很确定它的那一行)。
我似乎无法解决问题。该应用程序在Xcode与iOS 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'
知道这个错误来自何处或导致错误?
也是为了让您知道,使用iOS 4.2升级到XCode会导致某些文件从我的项目中删除。我不知道为什么会这样,是不是因为它们是链接文件而实际上并不是我不知道的文件夹。
有什么想法吗?
由于
//编辑
此方法位于AppDelegate中:
- (NSManagedObjectContext *)managedObjectContext {
if (managedObjectContext_ != nil) {
return managedObjectContext_;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
managedObjectContext_ = [[NSManagedObjectContext alloc] init];
[managedObjectContext_ setPersistentStoreCoordinator:coordinator];
}
return managedObjectContext_;
}
//再次编辑
- (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];
}
}
//编辑3
如果我将此代码放在我的应用委托的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 :(得分:1)
在快速查看代码之后,我想我发现了一些需要注意的部分。我会尝试在下面分解它们:
<强> SMSAppAppDelegate 强>
1)请注意,在您的接口文件中,您使用变量名末尾的下划线声明CoreData变量。然后为每个ivar 创建属性,不用下划线。只要你帮助他们完成正确的任务,这一切都很好,这似乎在你的实现中缺失了:
@synthesize managedObjectContext=managedObjectContext_;
@synthesize managedObjectModel=managedObjectModel_;
@synthesize persistentStoreCoordinator=persistentStoreCoordinator_;
<强> DownloadContacts 强>
1)在这个类中,您直接通过变量调用managedObjectContext。我不建议这样做,但这不是你的实际问题。请注意,即使您没有所有权,也可以在dealloc上释放managedObjectContext!
2)在这种情况下,我要做的是声明上下文的属性,始终通过属性访问它。此外,如果您重命名实例变量以在末尾包含下划线,那么您最大限度地减少了直接访问它的可能性(即不使用self。),这将使您更容易找到此类中您实际执行此操作的位置(记忆中有几个地方。
因此,在您的接口文件中,重命名managedObjectContext ivar并声明一个属性:
NSManagedObjectContext *managedObjectContext_;
...
@property (nonatomic, retain) NSManagedObjectContext managedObjectContext;
并且不要忘记在@sythesize上进行赋值并在dealloc上发布,因为你使用了retain属性:
@synthesize managedObjectContext=managedObjectContext_;
...
[managedObjectContext_ release];
然后,如果你尝试编译,你会得到两到三个无法识别的实例变量的错误,你需要将它改为self.managedObjectContext
<强> MessagesRootViewController 强>
最后我建议你在MessagesRootViewController中执行相同的过程,但是这个过程应该仍然可以正常工作!
如果上述任何内容不明确,请了解您的情况并告诉我们! 干杯, ROG
答案 1 :(得分:0)
我假设你正在做类似的事情:
[ClassName persistentStoreCoordinator]
确保ClassName
已定义且具有persistentStoreCoordinator
类方法。也许这些东西的文件被删除了?
马特
答案 2 :(得分:0)
您的数据库可能已损坏,请尝试重置iOS模拟器 点击iOS模拟器&gt;重置内容和设置。
修改的: 看起来你正试图调用一个不存在的选择器。尝试确定删除了哪些文件,因为您似乎有一个在运行时无法找到的方法。您的核心数据类是否已被删除,可能吗?