UICalloutView willRemoveSubview:]:发送给deallocated实例的消息;
仅当我点击标注按钮时才会发生这种情况,但不是在第一次点击而不是第二次点击时,而是从第3次点击。所以我点击自定义AnnotationView
,标注弹出,这很好。我再次点击它,标注弹出,一切都很好。我轻拍另一个,用这个消息轰炸。只有将正确的附件视图设置为按钮才会发生。
要牢记的一个关键方面......仅在iOS 6中发生...(去图)。
我真的被困在这一个 - 一些帮助将不胜感激。
if ([annotation isKindOfClass:[RE_Annotation class]])
{
RE_Annotation *myAnnotation = (RE_Annotation *)annotation;
static NSString *annotationIdentifier = @"annotationIdentifier";
RE_AnnotationView *newAnnotationView = (RE_AnnotationView *)[mapViews dequeueReusableAnnotationViewWithIdentifier:annotationIdentifier];
if(newAnnotationView)
{
newAnnotationView.annotation = myAnnotation;
}
else
{
newAnnotationView = [[RE_AnnotationView alloc] initWithAnnotation:myAnnotation reuseIdentifier:annotationIdentifier];
}
return newAnnotationView;
}
return nil;
此外,这是我的initwithannotation
方法:
- (id)initWithAnnotation:(id<MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
if(self)
{
RE_Annotation *myAnnotation = annotation;
self = [super initWithAnnotation:myAnnotation reuseIdentifier:reuseIdentifier];
self.frame = CGRectMake(0, 0, kWidth, kHeight);
self.backgroundColor = [UIColor clearColor];
annotationView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"map_pin_pink.png"]];
annotationView.frame = CGRectMake(0, 0, kWidth - 2 *kBorder, kHeight - 2 * kBorder);
[self addSubview:annotationView];
[annotationView setContentMode:UIViewContentModeScaleAspectFill];
self.canShowCallout = YES;
self.rightCalloutAccessoryView = [[UIButton buttonWithType:UIButtonTypeInfoLight] retain]; ///if i take it out it doesnt crash the app. if i leave it it says that message
}
return self ;
}
答案 0 :(得分:1)
在initWithAnnotation
方法中,有这一行:
self.rightCalloutAccessoryView =
[[UIButton buttonWithType:UIButtonTypeInfoLight] retain];
///if i take it out it doesnt crash the app. if i leave it it says that message
通过“it”,您必须引用retain
,这意味着该应用不使用ARC。
基于此,您应该进行以下更正:
在viewForAnnotation
中,当您分配+ init时,需要autorelease
视图,否则会出现泄漏:
newAnnotationView = [[[RE_AnnotationView alloc]
initWithAnnotation:myAnnotation
reuseIdentifier:annotationIdentifier] autorelease];
在initWithAnnotation
中,在创建标注按钮时删除retain
,因为buttonWithType
会返回自动释放的对象(并且您不想过度保留它) :
self.rightCalloutAccessoryView =
[UIButton buttonWithType:UIButtonTypeInfoLight];
另一个可能不相关的问题是,在initWithAnnotation
中,代码正在调用super initWithAnnotation
两次。这似乎是不必要的,可能是有害的。删除第二个电话。
上述更改至少可以解决所显示代码的问题。但是,在应用程序的其余部分中可能还存在其他类似的内存管理相关问题,这些问题仍可能导致崩溃。检查并解决Analyzer报告的所有问题。
关于“它只发生在iOS 6中”这一事实:iOS 6可能不太容忍内存管理错误,或者SDK中的内部更改可能会更早地暴露或显示这些错误。无论如何,上述修复是必要的。
一个不相关的点是,不需要手动创建注释视图的UIImageView
和addSubview
。您只需设置注释视图的image
属性。