use NSMapTable instead of NSDictionary as cache