我对设置MKReverseGeocoderDelegate感到有点困惑,我从Apples示例中注意到他们将MKReverseGeocoder分配给属性iVar,最后我决定在找到位置时分配MKReverseGeocoder并释放MKReverseGeocoders,因为它们要么报告成功还是失败,这看起来是否正确?
// ------------------------------------------------------------------- **
// DELEGATE: CLLocationManager
// ------------------------------------------------------------------- **
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation {
MKReverseGeocoder *myGeocoder = [[MKReverseGeocoder alloc] initWithCoordinate:[newLocation coordinate]];
[myGeocoder setDelegate:self];
[myGeocoder start];
}
// ------------------------------------------------------------------- **
// DELEGATE: MKReverseGeocoderDelegate
// ------------------------------------------------------------------- **
- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)placemark {
NSLog(@"%@", [placemark locality]);
[geocoder release];
}
- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError *)error {
[geocoder release];
}
@end
答案 0 :(得分:3)
你在内存管理方面很好。如果你通过Instruments中的泄漏工具运行它,它可能会抱怨你的locationManager:didUpdate
方法可能存在泄漏,但是这是错误的,它只是看不到你释放对象的位置。 / p>
但是,我会做一些事情来减少对地理编码器的影响。我会看到你didUpdate
所处的位置具有值得讨论的准确性。当核心位置首次出现时,您可能会在硬件真正启动并接收之前获得一些垃圾命中。然后准确性将缩小到真实位置(谷歌地图应用程序非常清楚地显示了那里发生的事情,蓝色圆圈在你的真实位置归零)。在您获得100米左右的精确度之前,地理编码可能没有任何意义。
编辑:试试这个
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation {
if((newLocation.coordinate.latitude != oldLocation.coordinate.latitude) &&
(newLocation.coordinate.longitude != oldLocation.coordinate.longitude) &&
([newLocation horizontalAccuracy] < 100 && [newLocation horizontalAccuracy] > 0))
{
MKReverseGeocoder *myGeocoder = [[MKReverseGeocoder alloc] initWithCoordinate:[newLocation coordinate]];
[myGeocoder setDelegate:self];
[myGeocoder start];
}
}
这应该忽略与上次更新相同的更新(可能相当频繁)和那些具有无效准确性的更新(当位置硬件首次启动时偶尔会出现负数)或结束时100米的水平精度。
此外,如果您只想这样做一次,请在获得有效且足够准确的位置后继续让CLLocationManager停止更新。
答案 1 :(得分:1)
在MKReverseGeocoder Class Reference中,Apple说
每个Map Kit应用程序都具有有限的反向地理编码容量,因此谨慎使用反向地理编码请求对您有利。以下是最有效使用此类的一些经验法则:
- 为任何一个用户操作发送最多一个反向地理编码请求。
(...)
在您的情况下,如果网络连接速度较慢(即位置更改比位置查找更快),则可以实例化多个请求。
在大多数情况下,您的代码可能会正常工作,但不是建议的实现方式。实施任何只能“在大多数情况下”工作的东西根本不是一个好主意。