类的实例被解除分配,而键值观察者仍向其注册
Posted
技术标签:
【中文标题】类的实例被解除分配,而键值观察者仍向其注册【英文标题】:Instance of class was deallocated while key value observers were still registered with it 【发布时间】:2013-08-29 07:39:03 【问题描述】:我正在添加注释,我的地图上应该有 5 个注释图钉,但只出现了 2 个并且显示了此错误:
Annotation 类的实例 0x9d8e720 在 key 时被释放 价值观察者仍然在其中注册。观察信息是 泄漏,甚至可能被错误地附着在其他物体上。 在 NSKVODeallocateBreak 上设置断点以停止 h
//NUH COORDINATES
#define NUH_latitude 1.293700;
#define NUH_longitude 103.783353;
//span
#define the_span 0.002f;
//NHGP COORDINATES!
#define NHGP_latitude 1.295938;
#define NHGP_longitude 103.782857;
//NUHER COORDINATES
#define NUHER_latitude 1.294968;
#define NUHER_longitude 103.783716;
//NUCIS COORDINATES
#define NUCIS_latitude 1.293149;
#define NUCIS_longitude 103.783464;
//Viva-UCCC COORDINATES!
#define VivaUCCC_latitude 1.294099;
#define VivaUCCC_longitude 103.783233;
//span
MKCoordinateSpan span;
span.latitudeDelta = the_span;
span.longitudeDelta = the_span;
MKCoordinateRegion myRegion;
//center
CLLocationCoordinate2D center;
center.latitude = NUH_latitude;
center.longitude = NUH_longitude;
myRegion.center =center;
myRegion.span = span;
[mapview setRegion:myRegion animated:YES];
//annotation
NSMutableArray * locations = [[NSMutableArray alloc] init];
CLLocationCoordinate2D location;
Annotation * myAnn;
//NUH location
myAnn = [[Annotation alloc] init];
location.latitude = NUH_longitude;
location.longitude = NUH_longitude;
myAnn.coordinate = location;
myAnn.title = @"NUH";
[locations addObject:myAnn];
//NHGP location
myAnn = [[Annotation alloc] init];
location.latitude = NHGP_latitude;
location.longitude = NHGP_longitude;
myAnn.coordinate = location;
myAnn.title = @"National Healthcare Group Polyclinic ";
[locations addObject:myAnn];
//NUHER location
myAnn = [[Annotation alloc] init];
location.latitude = NUHER_longitude;
location.longitude = NUHER_longitude;
myAnn.coordinate = location;
myAnn.title = @"National University Hospital Emergency Room";
[locations addObject:myAnn];
//NUCIS location
myAnn = [[Annotation alloc] init];
location.latitude = NUCIS_longitude;
location.longitude = NUCIS_longitude;
myAnn.coordinate = location;
myAnn.title = @"National University Cancer Institute Singapore";
[locations addObject:myAnn];
//Viva-UCCC location
myAnn = [[Annotation alloc] init];
location.latitude = VivaUCCC_latitude;
location.longitude = VivaUCCC_longitude;
myAnn.coordinate = location;
myAnn.title = @"Viva-University Children's Cancer Centre";
[locations addObject:myAnn];
[self.mapview addAnnotations:locations];
【问题讨论】:
这个错误通常发生在坐标无效的情况下。确保纬度从 -90 到 +90,经度从 -180 到 +180。见***.com/questions/5872547/…。 我从谷歌地图得到坐标,我所有的注释针的纬度是-90到+90,经度是-180到+180。但仍然无法让我所有的引脚工作。 @安娜卡列尼娜 显示添加注释的代码(编辑您的问题并添加代码)以及坐标属性的设置方式。 完成编辑,对不起,我是新来的,所以我知道为什么有这么多的间距。 @安娜卡列尼娜 【参考方案1】:您已为 NUH、NUHER 和 NUCIS 的纬度指定经度。它们不会显示在您想要的位置(这就是您只看到 2 的原因),我认为错误是因为这些值对纬度无效。
//NUH location
location.latitude = NUH_longitude; // <-- should be NUH_latitude
...
//NUHER location
location.latitude = NUHER_longitude; // <-- should be NUHER_latitude
...
//NUCIS location
location.latitude = NUCIS_longitude; // <-- should be NUCIS_latitude
【讨论】:
非常感谢! @zpasternack【参考方案2】:这可能是因为您一直在重新分配相同的 myAnn 变量。您应该尝试创建多个Annotation
s,如果需要,将它们称为 myAnn1、myAnn2。
稍后,如果您拥有超过 3 个这样的东西,您应该考虑创建一个集合并循环遍历它,而不是一个接一个地创建它们
【讨论】:
以上是关于类的实例被解除分配,而键值观察者仍向其注册的主要内容,如果未能解决你的问题,请参考以下文章