类的实例被解除分配,而键值观察者仍向其注册

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 变量。您应该尝试创建多个Annotations,如果需要,将它们称为 myAnn1、myAnn2。

稍后,如果您拥有超过 3 个这样的东西,您应该考虑创建一个集合并循环遍历它,而不是一个接一个地创建它们

【讨论】:

以上是关于类的实例被解除分配,而键值观察者仍向其注册的主要内容,如果未能解决你的问题,请参考以下文章

AVAudioPlayer 被解除分配,而键值观察者仍向其注册

iOS 5 AVPlayerItem 的一个实例被释放

facebook ios sdk 日志:奇怪的消息

类 -(MyAnnotation 注释)被释放

如何用键盘解决这个奇怪的崩溃

Objective-C 删除某个通知的所有观察者