0

我的 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)
4

1 回答 1

1

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

解决方案是在您的“Place”自定义类中符合并实现协议 NSCopying 并返回 self。这样关键实例在任何地方都是相同的。

- (id)copyWithZone:(NSZone *)zone
{
   return self;
}
于 2013-10-28T03:23:41.203 回答