1

UICalloutView willRemoveSubview:]: 消息发送到释放实例;

这只发生在我点击标注按钮时,但不是在第一次和第二次点击时,而是从第三次点击。所以我点击自定义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 ;

}
4

1 回答 1

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

通过“它”,您必须指的是retain,这意味着该应用程序未使用 ARC。


在此基础上,您应该进行以下更正:

  • viewForAnnotation中,您需要在分配autorelease+ 初始化时查看视图,否则会出现泄漏:

    newAnnotationView = [[[RE_AnnotationView alloc] 
        initWithAnnotation:myAnnotation 
        reuseIdentifier:annotationIdentifier] autorelease];
    
  • 在中,在创建标注按钮时initWithAnnotation删除,因为返回一个自动释放的对象(并且您不想过度保留它):retainbuttonWithType

    self.rightCalloutAccessoryView = 
        [UIButton buttonWithType:UIButtonTypeInfoLight];
    


另一个可能不相关的问题是,initWithAnnotation代码调用super initWithAnnotation了两次。这似乎没有必要,而且可能有害。删除第二个电话。


上述更改至少解决了所示代码的问题。但是,在应用程序的其余部分中可能存在其他类似的内存管理相关问题,这些问题仍可能导致崩溃。检查并解决 Analyzer 报告的所有问题。

关于“它只发生在 iOS 6”这一事实:iOS 6 可能不太容忍内存管理错误,或者 SDK 中的内部更改可能会更早地暴露或显示这些错误。无论如何,上述修复都是必要的。


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

于 2013-01-24T14:08:42.333 回答