This has me totally stumped.

I have an app that contains (currently) three Entities:
Person
Deed; and
DeedDoneByPerson

Deed is effectively a template object. I'll probably re-do the object model but 
I want to understand what's going on with this bug first.

Deeds can be good or not and have a degree of goodness.

Here is the code that creates a new deed and deedDoneByPerson:

        NSManagedObject *newDeed = [ NSEntityDescription 
insertNewObjectForEntityForName: @"Deed" 
                                                                  
inManagedObjectContext: context ];

        int score;
        if( self.isGood )  score =   sender.tag;
        else               score = - sender.tag; 
         
        [newDeed setValue: self.deedName.text                               
forKey: @"deedName" ];
        [newDeed setValue: [ NSNumber numberWithBool: self.isGood         ] 
forKey: @"isGood"   ];
        [newDeed setValue: [ NSNumber numberWithInt:  score               ] 
forKey: @"points"   ];
        
        NSManagedObject *newDeedDoneByPerson = [ NSEntityDescription 
insertNewObjectForEntityForName: @"DeedDoneByPerson" 
                                                                              
inManagedObjectContext: context ];
        
        [newDeedDoneByPerson setValue: newDeed                                  
forKey: @"deedDone" ];
        [newDeedDoneByPerson setValue: selectedPerson                           
forKey: @"byPerson" ];
        [newDeedDoneByPerson setValue: [ NSNumber numberWithBool: self.isGood ] 
forKey: @"isGood"   ];
            // let 'points' and 'instances' default
        
        FYI2( @":: Create new deed [...@]", self.deedName.text );
        NSError *error;
        if (![context save:&error]) //!!!!!!! CRASHES HERE !!!!!!!! 
        {
            NSLog(@"!! Unresolved error %@, %@", error, [error userInfo]);
            abort();
        }


The following scenarios work:
With a fresh app (deleted from the simulator and re-installed), create a person 
and add any number of bad deeds to that person - they are displayed correctly 
and sqlite has the expected contents.
With a fresh app (deleted from the simulator and re-installed), create a person 
and add any number of good deeds to that person - they are displayed correctly 
and sqlite has the expected contents.
With a fresh app (deleted from the simulator and re-installed), create a person 
and add any number of bad deeds to that person - they are displayed correctly 
and sqlite has the expected contents. Then create another person and add any 
number of good deeds to that person -  they are displayed correctly and sqlite 
has the expected contents

The following scenario does NOT work:
With a fresh app (deleted from the simulator and re-installed), create a person 
and add a bad deed to that person then attempt to add a good deed. BOOM

Stack trace:
#0      0x93affedb in objc_msgSend
#1      0x939f4b6c in ??
#2      0x0001763a in _nsnote_callback
#3      0x01d34005 in _CFXNotificationPostNotification
#4      0x00014ef0 in -[NSNotificationCenter 
postNotificationName:object:userInfo:]
#5      0x01ba717d in -[NSManagedObjectContext(_NSInternalNotificationHandling) 
_postObjectsDidChangeNotificationWithUserInfo:]
#6      0x01c06763 in -[NSManagedObjectContext(_NSInternalChangeProcessing) 
_createAndPostChangeNotification:withDeletions:withUpdates:withRefreshes:]
#7      0x01b8b5ea in -[NSManagedObjectContext(_NSInternalChangeProcessing) 
_processRecentChanges:]
#8      0x01bc1728 in -[NSManagedObjectContext save:]
#9      0x00005434 in -[NewDeedViewController commit:] at 
NewDeedViewController.m:131 <------------------- CODE ABOVE
#10     0x00298459 in -[UIApplication sendAction:to:from:forEvent:]
#11     0x002fbba2 in -[UIControl sendAction:to:forEvent:]
#12     0x002fddc3 in -[UIControl(Internal) _sendActionsForEvents:withEvent:]
#13     0x002fcb0f in -[UIControl touchesEnded:withEvent:]
#14     0x002b1e33 in -[UIWindow _sendTouchesForEvent:]
#15     0x0029b81c in -[UIApplication sendEvent:]
#16     0x002a20b5 in _UIApplicationHandleEvent
#17     0x0252cef1 in PurpleEventCallback
#18     0x01d40b80 in CFRunLoopRunSpecific
#19     0x01d3fc48 in CFRunLoopRunInMode
#20     0x0252b7ad in GSEventRunModal
#21     0x0252b872 in GSEventRun
#22     0x002a3003 in UIApplicationMain
#23     0x00001cb4 in main at main.m:14

I don't understand how the value of 'score' breaks things. If I get rid of the 
negation in this code:
        int score;
        if( self.isGood )  score =   sender.tag;
        else               score = - sender.tag; 
everything works fine: adding good and bad to the same person is acceptable.

Any suggestions on what to investigate?


_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to