David Poxon
David Poxon

Reputation: 2503

NSMutableDictionary key not finding object

I have the following method in my iOS application. The statement:

GMSMarker *marker = [places objectForKey:place];

does not always find the object for the key, when I definitely know there is an object to be found.

The method is:

- (void)removePlacesOfType:(AmenityType)type {
NSMutableArray* objectsToRemove = [[NSMutableArray alloc] init];

    for (Place *place in places) {
        if (place.type == type) {
            GMSMarker *marker = [places objectForKey:place];
            NSLog(@"%@ /// %@",place, marker);
            marker.map = nil;
            [objectsToRemove addObject:place];
        }
    }
    [places removeObjectsForKeys:objectsToRemove];
}

Updated to include object dump:

2013-10-28 13:11:20.988 Trancierge[12881:70b] **Pre For-Loop

2013-10-28 13:11:20.989 Trancierge[12881:70b] Markers built: 16
2013-10-28 13:11:20.989 Trancierge[12881:70b] <GMSMarker: 0x1b29cd30> (null) (-27.475179, 153.016384), <UIImage: 0x9e45680>
2013-10-28 13:11:20.989 Trancierge[12881:70b] <GMSMarker: 0x1b2b3550> (null) (-27.477081, 153.012322), <UIImage: 0x9e45680>
2013-10-28 13:11:20.990 Trancierge[12881:70b] <GMSMarker: 0x1b27d9c0> (null) (-27.477321, 153.012479), <UIImage: 0x9e45680>
2013-10-28 13:11:20.990 Trancierge[12881:70b] <GMSMarker: 0x1b2b2d80> (null) (-27.477032, 153.013461), <UIImage: 0x9e45680>
2013-10-28 13:11:20.990 Trancierge[12881:70b] <GMSMarker: 0x1b27d6f0> (null) (-27.474801, 153.016204), <UIImage: 0x9e45680>
2013-10-28 13:11:20.990 Trancierge[12881:70b] <GMSMarker: 0x1b27deb0> (null) (-27.476008, 153.013956), <UIImage: 0x9e45680>
2013-10-28 13:11:20.990 Trancierge[12881:70b] <GMSMarker: 0x1b27e0b0> (null) (-27.476420, 153.012121), <UIImage: 0x9e45680>
2013-10-28 13:11:20.991 Trancierge[12881:70b] <GMSMarker: 0x1b27e2e0> (null) (-27.477069, 153.012231), <UIImage: 0x9e45680>
2013-10-28 13:11:20.991 Trancierge[12881:70b] <GMSMarker: 0x1b27e510> (null) (-27.477887, 153.012734), <UIImage: 0x9e45680>
2013-10-28 13:11:20.991 Trancierge[12881:70b] <GMSMarker: 0x1b27e740> (null) (-27.477337, 153.012621), <UIImage: 0x9e45680>
2013-10-28 13:11:20.991 Trancierge[12881:70b] <GMSMarker: 0x1b27e970> (null) (-27.475651, 153.013364), <UIImage: 0x9e45680>
2013-10-28 13:11:20.992 Trancierge[12881:70b] <GMSMarker: 0x1b27eba0> (null) (-27.477033, 153.013458), <UIImage: 0x9e45680>
2013-10-28 13:11:20.992 Trancierge[12881:70b] <GMSMarker: 0x1b27edd0> (null) (-27.476088, 153.016655), <UIImage: 0x9e45680>
2013-10-28 13:11:20.992 Trancierge[12881:70b] <GMSMarker: 0x1b27f000> (null) (-27.475618, 153.016321), <UIImage: 0x9e45680>
2013-10-28 13:11:20.992 Trancierge[12881:70b] <GMSMarker: 0x1b27f240> (null) (-27.477225, 153.016497), <UIImage: 0x9e45680>
2013-10-28 13:11:20.992 Trancierge[12881:70b] <GMSMarker: 0x1b27f480> (null) (-27.477740, 153.012813), <UIImage: 0x9e45680>

2013-10-28 13:11:20.993 Trancierge[12881:70b] **In For-Loop

2013-10-28 13:11:20.993 Trancierge[12881:70b] <Place: 0x1b2bce90> /// (null)
2013-10-28 13:11:20.993 Trancierge[12881:70b] <Place: 0x1b2b5100> /// <GMSMarker: 0x1b2b3550> (null) (-27.477081, 153.012322), <UIImage: 0x9e45680>
2013-10-28 13:11:20.993 Trancierge[12881:70b] <Place: 0x1b2b2d60> /// (null)
2013-10-28 13:11:20.993 Trancierge[12881:70b] <Place: 0x1b27d630> /// (null)
2013-10-28 13:11:20.993 Trancierge[12881:70b] <Place: 0x1b27d7e0> /// (null)
2013-10-28 13:11:20.994 Trancierge[12881:70b] <Place: 0x1b27df90> /// (null)
2013-10-28 13:11:20.994 Trancierge[12881:70b] <Place: 0x1b27e1c0> /// (null)
2013-10-28 13:11:20.994 Trancierge[12881:70b] <Place: 0x1b27e3f0> /// (null)
2013-10-28 13:11:20.994 Trancierge[12881:70b] <Place: 0x1b27e620> /// <GMSMarker: 0x1b27e510> (null) (-27.477887, 153.012734), <UIImage: 0x9e45680>
2013-10-28 13:11:20.994 Trancierge[12881:70b] <Place: 0x1b27e850> /// (null)
2013-10-28 13:11:20.994 Trancierge[12881:70b] <Place: 0x1b27ea80> /// <GMSMarker: 0x1b27e970> (null) (-27.475651, 153.013364), <UIImage: 0x9e45680>
2013-10-28 13:11:20.995 Trancierge[12881:70b] <Place: 0x1b27ecb0> /// <GMSMarker: 0x1b27eba0> (null) (-27.477033, 153.013458), <UIImage: 0x9e45680>
2013-10-28 13:11:20.995 Trancierge[12881:70b] <Place: 0x1b27eee0> /// (null)
2013-10-28 13:11:20.995 Trancierge[12881:70b] <Place: 0x1b27f120> /// (null)
2013-10-28 13:11:20.995 Trancierge[12881:70b] <Place: 0x1b27f360> /// (null)
2013-10-28 13:11:20.995 Trancierge[12881:70b] <Place: 0x1b27f5a0> /// (null)

Upvotes: 0

Views: 146

Answers (1)

San
San

Reputation: 1796

Key added to NSDictionary should always conform to NSCopying Protocol. And the default implementation will create a new instance of key object (Place in your case).

Solution is to conform and implement the protocol NSCopying in your 'Place' custom class and return self. So that the key instance is same everywhere.

- (id)copyWithZone:(NSZone *)zone
{
   return self;
}

Upvotes: 1

Related Questions