标注按钮崩溃应用程序 - MapKit

时间:2013-01-24 10:05:38

标签: ios ios6 mkmapview mkannotation mkannotationview

  

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 ;

}

1 个答案:

答案 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中的内部更改可能会更早地暴露或显示这些错误。无论如何,上述修复是必要的。


一个不相关的点是,不需要手动创建注释视图的UIImageViewaddSubview。您只需设置注释视图的image属性。