NSMutableDictionary键未找到对象

时间:2013-10-28 02:34:52

标签: ios objective-c nsdictionary nsmutabledictionary

我的iOS应用程序中有以下方法。声明:

GMSMarker *marker = [places objectForKey:place];

并不总是找到键的对象,当我肯定知道有一个对象可以找到时。

方法是:

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

更新为包含对象转储:

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)

1 个答案:

答案 0 :(得分:1)

添加到NSDictionary的密钥应始终符合NSCopying协议。默认实现将创建一个新的密钥对象实例(在您的情况下放置)。

解决方案是在“Place”自定义类中遵循并实现协议NSCopying并返回self。所以关键实例在任何地方都是一样的。

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