jason
jason

Reputation: 5481

Terminating app due to uncaught exception 'NSInvalidArgumentException'

I have the following problem. I inherited an app and I am trying to modify it. The original functionality lets me add a task with some text notes. I want to add an icon to make it more visually appealing. When I modify the code signature to pass the icon (in reality I am only passing the name of the icon in a NSString) the modules stops working and the app throws the following error, basically an unrecognized selector:

2011-03-19 22:41:17.713 app[82653:207] -[RemindersDataManager addReminder:notes:locations:icon:]: unrecognized selector sent to instance 0xc700bc0
2011-03-19 22:41:17.716 app[82653:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[RemindersDataManager addReminder:notes:locations:icon:]: unrecognized selector sent to instance 0xc700bc0'
*** Call stack at first throw:
(
        0   CoreFoundation                      0x0162abe9 __exceptionPreprocess + 185
        1   libobjc.A.dylib                     0x0177f5c2 objc_exception_throw + 47
        2   CoreFoundation                      0x0162c6fb -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
        3   CoreFoundation                      0x0159c366 ___forwarding___ + 966
        4   CoreFoundation                      0x0159bf22 _CF_forwarding_prep_0 + 50
        5   app                               0x000158b1 -[GeoRemindersManager addReminder:notes:locations:icon:] + 121
        6   app                               0x0000f268 -[AddReminderViewController addReminder] + 655
        7   UIKit                               0x0053ea6e -[UIApplication sendAction:to:from:forEvent:] + 119
        8   UIKit                               0x005cd1b5 -[UIControl sendAction:to:forEvent:] + 67
        9   UIKit                               0x005cf647 -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 527
        10  UIKit                               0x005ce1f4 -[UIControl touchesEnded:withEvent:] + 458
        11  UIKit                               0x007c9987 _UIGestureRecognizerSortAndSendDelayedTouches + 3609
        12  UIKit                               0x007ca0fc _UIGestureRecognizerUpdateObserver + 927
        13  CoreFoundation                      0x0160bfbb __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 27
        14  CoreFoundation                      0x015a10e7 __CFRunLoopDoObservers + 295
        15  CoreFoundation                      0x01569bd7 __CFRunLoopRun + 1575
        16  CoreFoundation                      0x01569240 CFRunLoopRunSpecific + 208
        17  CoreFoundation                      0x01569161 CFRunLoopRunInMode + 97
        18  GraphicsServices                    0x01ce4268 GSEventRunModal + 217
        19  GraphicsServices                    0x01ce432d GSEventRun + 115
        20  UIKit                               0x0054d42e UIApplicationMain + 1160
        21  app                               0x00002d1c main + 102
        22  app                               0x00002cad start + 53
)
terminate called after throwing an instance of 'NSException'.

These are the original module's signature

AddReminderViewController.h

// user actions
- (IBAction)addReminder;

AddReminderViewController.m

- (IBAction)addReminder {
        if ([self dataVerification]) {
                BOOL result = NO;
                // try to add one geo fence or several geo fences
                if (self.address) {
                        result = [[GeoRemindersManager sharedInstance] addReminder:self.titleField.text notes:self.detailsField.text 
                                                                                                                        coordinate:self.coordinate address:self.address];
                }
                else if (self.locations) {
                        result = [[GeoRemindersManager sharedInstance] addReminder:self.titleField.text notes:self.detailsField.text locations:self.locations];
                }
                // successfully added - close
                if (result) {
                        [self.navigationController popToRootViewControllerAnimated:YES];
                }

GeoRemindersManager.h

// shared instance
+ (GeoRemindersManager *)sharedInstance;
// workflow
- (void)start;
- (BOOL)addReminder:(NSString *)title notes:(NSString *)notes 
                 coordinate:(CLLocationCoordinate2D)coordinate address:(NSString *)address;
- (BOOL)addReminder:(NSString *)title notes:(NSString *)notes location:(LocationEntity *)location;
- (BOOL)addReminder:(NSString *)title notes:(NSString *)notes locations:(NSArray *)locations;
- (void)changeReminder:(NSString *)title title:(NSString *)newTitle notes:(NSString *)newNotes;
- (void)removeReminder:(NSString *)title;
- (ReminderEntity *)getReminderWithTitle:(NSString *)title;
- (NSArray *)getLoctionsWithCoordinate:(CLLocationCoordinate2D)coordinate;
- (void)wakeByLocalNotification:(NSDictionary *)info;
- (void)memoryWarning;
- (CLLocation *)getCurrentLocation;
// extra
- (BOOL)checkReminderExistance:(NSString *)title;
- (void)updateDelegatesWithReminder:(NSString *)title notes:(NSString *)notes;

GeoRemindersManager.m

+ (GeoRemindersManager *)sharedInstance {
        geoapp_iphoneAppDelegate *appDelegate = (geoapp_iphoneAppDelegate *)[MLSApplication instance];
        return appDelegate.remindersManager;
}

#pragma mark -
#pragma mark workflow

- (void)start {
        // start first locating
        [deviceLocation forceStart];
        // add geo fences to device location 
        NSArray *locations = [geoDataManager getAllRemindersLocations];
        [deviceLocation addMonitoringLocations:locations];
        // invoke delegate
        [delegateMap didAddMonitoringLocations:locations];
}

- (BOOL)addReminder:(NSString *)title notes:(NSString *)notes 
                 coordinate:(CLLocationCoordinate2D)coordinate address:(NSString *)address 
{
        if (![self checkReminderExistance:title]) {
                return NO;
        }
        // all verifications are OK, adding reminder
        [geoDataManager addReminder:title notes:notes coordinate:coordinate address:address];
        [self updateDelegatesWithReminder:title notes:notes];
        return YES;
}

- (BOOL)addReminder:(NSString *)title notes:(NSString *)notes location:(LocationEntity *)location {
        return [self addReminder:title notes:notes locations:[NSArray arrayWithObject:location]];
}

- (BOOL)addReminder:(NSString *)title notes:(NSString *)notes locations:(NSArray *)locations {
        if (![self checkReminderExistance:title]) {
                return NO;
        }
        // all verifications are OK, adding reminder
        [geoDataManager addReminder:title notes:notes locations:locations];
        [self updateDelegatesWithReminder:title notes:notes];
        return YES;
}

and the modified ones:

AddReminderViewController.m

- (IBAction)addReminder {
        if ([self dataVerification]) {
                BOOL result = NO;
                // try to add one geo fence or several geo fences
                if (self.address) {
                        result = [[GeoRemindersManager sharedInstance] addReminder:self.titleField.text notes:self.detailsField.text coordinate:self.coordinate address:self.address icon:(NSString *)iconButton.currentTitle];
                }
                else if (self.locations) {
                        result = [[GeoRemindersManager sharedInstance] addReminder:self.titleField.text notes:self.detailsField.text locations:self.locations icon:(NSString *)iconButton.currentTitle];
                }
                // successfully added - close
                if (result) {
                        [self.navigationController popToRootViewControllerAnimated:YES];
                }
        }
}

GeoRemindersManager.h

// shared instance
+ (GeoRemindersManager *)sharedInstance;
// workflow
- (void)start;
- (BOOL)addReminder:(NSString *)title notes:(NSString *)notes
         coordinate:(CLLocationCoordinate2D)coordinate address:(NSString *)address icon:(NSString *)icon;
- (BOOL)addReminder:(NSString *)title notes:(NSString *)notes location:(LocationEntity *)location icon:(NSString *)icon;
- (BOOL)addReminder:(NSString *)title notes:(NSString *)notes locations:(NSArray *)locations icon:(NSString *)icon;
- (void)changeReminder:(NSString *)title title:(NSString *)newTitle notes:(NSString *)newNotes icon:(NSString *)icon;
- (void)removeReminder:(NSString *)title;
- (ReminderEntity *)getReminderWithTitle:(NSString *)title;
- (NSArray *)getLoctionsWithCoordinate:(CLLocationCoordinate2D)coordinate;
- (void)wakeByLocalNotification:(NSDictionary *)info;
- (void)memoryWarning;
- (CLLocation *)getCurrentLocation;
// extra
- (BOOL)checkReminderExistance:(NSString *)title;
- (void)updateDelegatesWithReminder:(NSString *)title notes:(NSString *)notes icon:(NSString *)icon;

GeoRemindersManager.m

- (BOOL)addReminder:(NSString *)title notes:(NSString *)notes 
                 coordinate:(CLLocationCoordinate2D)coordinate address:(NSString *)address  icon:(NSString *)icon
{
        if (![self checkReminderExistance:title]) {
                return NO;
        }
        // all verifications are OK, adding reminder
        [geoDataManager addReminder:title notes:notes coordinate:coordinate address:address icon:icon];
        [self updateDelegatesWithReminder:title notes:notes icon:icon];
        return YES;
}

- (BOOL)addReminder:(NSString *)title notes:(NSString *)notes location:(LocationEntity *)location  icon:(NSString *)icon{
        return [self addReminder:title notes:notes locations:[NSArray arrayWithObject:location icon:icon]];
}

- (BOOL)addReminder:(NSString *)title notes:(NSString *)notes locations:(NSArray *)locations icon:(NSString *)icon {
        if (![self checkReminderExistance:title]) {
                return NO;
        }
        // all verifications are OK, adding reminder
        [geoDataManager addReminder:title notes:notes locations:locations  icon:icon];
        [self updateDelegatesWithReminder:title notes:notes];
        return YES;
}

So in short, the only thing I added was an additional argument to those function for the icon name as a NSString… Any clues? All help greatly appreciated! Thanks

Upvotes: 1

Views: 957

Answers (1)

Anomie
Anomie

Reputation: 94804

The error message indicates that the unrecognized selector was called on an object of class RemindersDataManager, probably from the line

[geoDataManager addReminder:title notes:notes locations:locations  icon:icon];

You should find the implementation of that class and add your icon parameter to its methods too (or stop passing icon to it if it has no use for the icon).

Upvotes: 3

Related Questions