开发者

Code data issue after upgrade to XCode + iOS 4.2

开发者 https://www.devze.com 2023-01-29 13:01 出处:网络
NSEntityDescription *entity = [NSEntityDescription entityForName:@\"Thread\" inManagedObjectContext:managedObjectContext];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Thread" inManagedObjectContext:managedObjectContext];

That line doesn't seem to work anymore (I'm pretty sure its that line).

I can't seem to work out whats the problem. The application worked perfectly on Xcode with iOS 4.1 and now crashes with this error in the console:

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'

Any idea where this error is coming from or what is causing it?

Just to let you know as well, upgrading to XCode with iOS 4.2 caused some of the files to be deleted from my project. I don't know why this was, whether it was because they were linked files and not actually in the folder I dunno.

Any ideas?

Thanks

// EDIT

This method is in the 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 AGAIN

- (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

If I put this code in the applicationDidFinishLoading of my app delegate it works fine!

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]];


After having a quick look at your code I think I found a couple of parts that needed attention. I'll try and break them down below:

SMSAppAppDelegate

1) Notice that in your interface file, you declare your CoreData variables with an underscore at the end of the variable name. Then you create properties for each of the ivar without the underscore. That is all fine as long as you @synthesize them making the correct assignment, which seems to be missing from your implementation:

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

DownloadContacts

1) In this class you are calling the managedObjectContext directly through the variable. I wouldn't recommend that but this is not your actual problem. Notice that you release the managedObjectContext on dealloc even though you have no ownership of it!

2) What I would do in this case is declare a property for the context and always access it via the property. Also if you rename your instance variable to include an underscore at the end you are minimising your chances of accessing it directly (i.e. without using self.) and it will make it easier for you to find where in this class you are actually doing that (there are a couple of places from memory).

So in your interface file, rename managedObjectContext ivar and declare a property:

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

And don't forget to make the assignment on @sythesize and release on dealloc, since you are using a retain property:

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

Then if you try and compile you will get two or three errors of unrecognised instance variable which is where you have to go and change it to self.managedObjectContext

MessagesRootViewController

And finally I'd recommend you go through the same process in your MessagesRootViewController but this one should still work fine as is!

See how you go and let me know if any of the above is not clear! Cheers, Rog


I'm assuming you're doing something like:

[ClassName persistentStoreCoordinator]

Make sure ClassName is defined and has the persistentStoreCoordinator class method. Perhaps the file that did these things got deleted?

Matt


Your database might be corrupted, try resetting the iOS simulator by clicking on iOS Simulator>Reset contents and settings.

Edit: It looks like you're trying to call a selector that doesn't exist. Try figuring out which files were deleted, as it seems like you have a method that is called that can't be found at runtime. Did your core data classes get erased, maybe?

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号