NSCFDictionary - Unrecognized selector sent to instance

1.1k views Asked by At

I have two modes - Mode 1 and Mode 2 which can be switched by a central button. Switch between modes allows user to see two different types of clustered annotations.

I can switch from Mode 1 to Mode 2 easily, but when I switch back to Mode 1 I'm getting this nasty error

-[__NSCFDictionary componentsSeparatedByString:]: unrecognized selector sent to instance 0x7fb1308cca50

I'm opening my code and in the TBClusteredAnnotations.m (script I'm using for clusterization). I have the following snippet of code relating to componentsSeparatedByString:

 TBQuadTreeNodeData TBDataFromLine(NSString *line)

{
    NSString *separator=@">>>>>>>>";

    NSArray *components = [line componentsSeparatedByString: separator];
    double latitude = [components[0] doubleValue];
    double longitude = [components[1] doubleValue];

    TBUserInfo* userInfo = malloc(sizeof(TBUserInfo));

    NSString *userName = [components[2] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    userInfo->userId = malloc(sizeof(char) * userName.length + 1);
    strncpy(userInfo->userId, [userName UTF8String], userName.length + 1);

    NSString *userId = [components [3] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    userInfo->userImage = malloc(sizeof(char) * userId.length + 1);
    strncpy(userInfo->userImage, [userId UTF8String], userId.length + 1);

    return TBQuadTreeNodeDataMake(latitude, longitude, userInfo);
}

but I'm loading my annotations with the following code in the MainViewController:

-(void)annotationsmode1:(NSMutableArray*)marr
{
    if(marr.count>0)
    {
        NSMutableArray *newMarr1=[NSMutableArray new];
        NSString *separatestuff=@">>>>>>>>";
        for(NSMutableDictionary *dic in marr)
        {
            NSString *newStr=[NSString stringWithFormat:@"%@%@",[dic[@"latitude"] isEqualToString:@""]?@" ":dic[@"latitude"],separatestuff];
            newStr=[NSString stringWithFormat:@"%@%@%@",newStr,[dic[@"longitude"] isEqualToString:@""]?@" ":dic[@"longitude"],separatestuff];
            newStr=[NSString stringWithFormat:@"%@%@%@",newStr,[dic[@"id"] isEqualToString:@""]?@" ":dic[@"id"],separatestuff];
            newStr=[NSString stringWithFormat:@"%@%@",newStr,[dic[@"image"] isEqualToString:@""]?@" ":dic[@"image"]];

            [newMarr1 addObject:newStr];

        }
        //NSLog(@"NEW Array: %@",newMarr);
        [self.coordinateQuadTree buildTree:newMarr1];
    }
}

-(void)annotationsmode2:(NSMutableArray*)marr
{
    if(marr.count>0)
    {
        NSMutableArray *newMarr=[NSMutableArray new];
        NSString *separatestuff2=@">>>>>>>>";
        for(NSMutableDictionary *dic in marr)
        {
            NSString *newStr=[NSString stringWithFormat:@"%@%@",[dic[@"lat"] isEqualToString:@""]?@" ":dic[@"lat"],separatestuff2];
            newStr=[NSString stringWithFormat:@"%@%@%@",newStr,[dic[@"lang"] isEqualToString:@""]?@" ":dic[@"lang"],separatestuff2];
            newStr=[NSString stringWithFormat:@"%@%@%@",newStr,[dic[@"id"] isEqualToString:@""]?@" ":dic[@"id"],separatestuff2];
            newStr=[NSString stringWithFormat:@"%@%@",newStr,[dic[@"image"] isEqualToString:@""]?@" ":dic[@"image"]];
            [newMarr addObject:newStr];
        }

        //NSLog(@"NEW Array: %@",newMarr);
        [self.coordinateQuadTree buildTree:newMarr];
    }

}

UPDATE: This is the block of code where the TBDataFromLine is used

- (void)buildTree:(NSMutableArray *)lines
{
    @autoreleasepool {

        NSInteger count = lines.count - 1;

        TBQuadTreeNodeData *dataArray = malloc(sizeof(TBQuadTreeNodeData) * count);
        for (NSInteger i = 0; i < count; i++) {
            dataArray[i] = TBDataFromLine(lines[i]);
        }
        //TBBoundingBox world = TBBoundingBoxMake(19, -166, 72, -53);
        TBBoundingBox world =  TBBoundingBoxMake(0,0,100,100);
        _root = TBQuadTreeBuildWithData(dataArray, count, world, 4);
    }
}

I've been working on this issue for hours now and still have no clue.

UPDATE: Here is the debugger's log I'm getting

    2015-06-20 19:40:23.759 MapProject[13426:395344] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary componentsSeparatedByString:]: unrecognized selector sent to instance 0x7fdf93775680'
*** First throw call stack:
(
    0   CoreFoundation                      0x0000000112699c65 __exceptionPreprocess + 165
    1   libobjc.A.dylib                     0x00000001121c3bb7 objc_exception_throw + 45
    2   CoreFoundation                      0x00000001126a10ad -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
    3   CoreFoundation                      0x00000001125f713c ___forwarding___ + 988
    4   CoreFoundation                      0x00000001125f6cd8 _CF_forwarding_prep_0 + 120
    5   MapProject 0x000000010f469ac4 TBDataFromLine + 84
    6   MapProject 0x000000010f46a36f -[TBCoordinateQuadTree buildTree:] + 191
    7   MapProject 0x000000010f3d2503 -[MMViewController findSpot:] + 771
    8   UIKit                               0x0000000110a52da2 -[UIApplication sendAction:to:from:forEvent:] + 75
    9   UIKit                               0x0000000110b6454a -[UIControl _sendActionsForEvents:withEvent:] + 467
    10  UIKit                               0x0000000110b63919 -[UIControl touchesEnded:withEvent:] + 522
    11  UIKit                               0x0000000110a9f998 -[UIWindow _sendTouchesForEvent:] + 735
    12  UIKit                               0x0000000110aa02c2 -[UIWindow sendEvent:] + 682
    13  UIKit                               0x0000000110a66581 -[UIApplication sendEvent:] + 246
    14  UIKit                               0x0000000110a73d1c _UIApplicationHandleEventFromQueueEvent + 18265
    15  UIKit                               0x0000000110a4e5dc _UIApplicationHandleEventQueue + 2066
    16  CoreFoundation                      0x00000001125cd431 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
    17  CoreFoundation                      0x00000001125c32fd __CFRunLoopDoSources0 + 269
    18  CoreFoundation                      0x00000001125c2934 __CFRunLoopRun + 868
    19  CoreFoundation                      0x00000001125c2366 CFRunLoopRunSpecific + 470
    20  GraphicsServices                    0x000000011444da3e GSEventRunModal + 161
    21  UIKit                               0x0000000110a51900 UIApplicationMain + 1282
    22  MapProject 0x000000010f474c2f main + 111
    23  libdyld.dy
)
libc++abi.dylib: terminating with uncaught exception of type NSException
2

There are 2 answers

2
Ankit Sachan On

Add an Exception break point and it will take to exactly to that line where that crash is happening. Also check 'line' cause it is changed to dictionary but you code expect it to be a string

0
iAdjunct On

There is no [] operator on NSArray or NSMutableArray.

You need this:

for (NSInteger i = 0; i < count; i++) {
    dataArray[i] = TBDataFromLine([lines objectAtIndex:i]);
}

Using [] on NSArray* effectively acted like "lines" was really a pointer to an array of NSMutableArray instances, whereas you wanted to get one of the items out of the array to which it pointed.