内存不被释放的MKMapView W / ARC(Memory not being released

2019-09-02 04:19发布

我有一个自定义UIView称为ActivityDetailView我实例,然后父视图控制器内添加到滚动视图。 当该自定义视图分配,它更多的内存每次占用约1MB和仪器的显示出存储永远不会被释放,即使视图和父视图控制器各自有各自dealloc被调用的方法。 我收到内存警告和应用程序最终被杀,所以我明明做错事。

更新w是关于地图视图/信息的原因,但我需要一个修复

在自定义ActivityDetailView笔尖文件,则存在被放大和周围的用户的位置为中心的地图视图。 当我删除从笔尖此地图视图,以便它不会在屏幕上画,内存分配问题就走了。 然而,我显然需要在地图视图。 在地图视图超出范围,为什么不公布地图视图的数据?

仅存在1 ActivityDetailView和1个ActivityDetailViewController活着当视图是显示。 当我弹出堆栈的看法,他们不再生活。 内存如何保持增长,即使对象正在被杀害通过仪器显示没有意义。 如果家长的意见将被释放,为什么没有在地图视图数据被释放?

我在做什么错误或我应该怎么检查?

这是自定义视图:

@interface ActivityDetailView ()
{
    CLLocation *location;
    __weak id parentViewController;
    int scrollViewX;

    ImageUtility *imageUtility;
}
@end

@implementation ActivityDetailView

-(id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
        NSArray *xibViews = [[NSBundle mainBundle] loadNibNamed:@"ActivityDetailView" owner:nil options:nil];
        if ([xibViews count] < 1) return nil;
        ActivityDetailView * xibView = [xibViews objectAtIndex:0];
        [xibView setFrame:frame];
        self = xibView;
    }
    return self;
}

- (id)initWithLocation:(CLLocation *)loc parentController:(id)parent
{
    self = [self initWithFrame:CGRectMake(0, 0, 320, 1000)];
    if (self)
    {
        imageUtility = [ImageUtility sharedManager];

        location = loc;
        parentViewController = parent;
        scrollViewX = 0;

        [self centerMapForActivityLocation];
        [self addPhotoButtonWithImageNamed:@"addActivityPhoto.png" target:parentViewController selector:@selector(addPhotoToActivity:)];
    }
    return self;
}

- (void)dealloc
{
    NSLog(@"ActivityDetailView was dealloced");
}

在父视图控制器:

@interface ActivityDetailViewController ()
{
    ActivityDetailView *detailView;
}
@end

@implementation ActivityDetailViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Some code left out for clarity

    [self setupView];
}

- (void)didReceiveMemoryWarning
{
    NSLog(@"Purging image cache");
    [[ImageUtility sharedManager] purgeCache];
}

- (void)dealloc
{
    // These essentially do nothing to help the problem
    detailView.mapView = nil;
    [detailView removeFromSuperview];
    detailView = nil;
    self.scrollView = nil;

    NSLog(@"ActivityDetailViewController was dealloced");
}

- (void)setupView
{    
    // Add the activity detail view to the scroll view
    detailView = [[ActivityDetailView alloc] initWithLocation:self.activityLocation parentController:self];
    [self.scrollView addSubview:detailView];
    self.scrollView.contentSize = detailView.frame.size;

    // Setup the map view
    detailView.mapView.delegate = self;
    MKPointAnnotation *annotation = [[MKPointAnnotation alloc] init];
    annotation.coordinate = self.activityLocation.coordinate;
    [detailView.mapView addAnnotation:annotation];
    if (self.activity.mapImageName) {
        detailView.mapView.scrollEnabled = YES;
        detailView.mapView.zoomEnabled = YES;
    } else {
        detailView.mapView.scrollEnabled = NO;
        detailView.mapView.zoomEnabled = NO;
    }

    // Add the weather area to the view
    dayView = [[DailyButtonView alloc] initWithFrame:CGRectMake(0, -17, 60, 70)];
    dayView.hidden = YES;
    [detailView.weatherView addSubview:dayView];
}

下面是从仪器显示,大多数的存储器是从笔尖加载的图像

我没有什么此刻缓存。 的观点基本上是与它内部的一个MapView和一些标签和几个表视图滚动型。 意见表中不填充任何东西,我不会比滚动视图的背景图像之外的视图中加载任何图片,但是当认为确实应该得到释放。

Answer 1:

事实证明,有一个已知的bug与iOS 6 MKMapView没有释放它的内存正常。 不幸的是,不是试图迫使地图视图以清除它不具有很大的释放上的内存缓存的影响没有其他真正的解决。

奇怪的是,即使当应用程序被接收内存警告,地图视图缓存仍然没有被正确清除。 最终,应用程序变得不稳定,并通过OS杀害。

苹果已经变得非常草率与他们的测试最近。 这是第二个错误MKMapView我已经遇到(另一个是mapViewDidFinishLoadingMap:正在叫早)和两个bug已经真的很明显捕捉如果他们刚刚做了一些性能和健全测试。

下面是一些代码,可能有帮助:

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];

    // This is for a bug in MKMapView for iOS6
    [self purgeMapMemory];
}

// This is for a bug in MKMapView for iOS6
// Try to purge some of the memory being allocated by the map
- (void)purgeMapMemory
{
    // Switching map types causes cache purging, so switch to a different map type
    detailView.mapView.mapType = MKMapTypeStandard;
    [detailView.mapView removeFromSuperview];
    detailView.mapView = nil;
}

你可以做的另一件事是使用的一个实例MKMapView您的整个应用程序,这应该有助于减少显示的视图,因为地图视图都已经被分配,每次有多少内存分配。



Answer 2:

这是不是真的,创建从笔尖文件的自定义视图的最佳途径。 我建议你做的是添加你从笔尖文件作为一个子视图自持有的观点。 代码应该是这个样子。

-(id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
        NSArray *xibViews = [[NSBundle mainBundle] loadNibNamed:@"ActivityDetailView" owner:nil options:nil];
        if ([xibViews count] < 1) return nil;
        ActivityDetailView * xibView = [xibViews objectAtIndex:0];
        [xibView setFrame:frame];
        [self addSubview:xibView]; // This is where I have changed your code
    }
    return self;
}


Answer 3:

你可能面临着高速缓存的问题。

如果您使用的是大量的图像,也许一个很好的选择是从厦门国际银行删除此图像,并使用代码添加它。 或者,如果您使用的是加载图像[UIImage imageNamed:@""]

但是,使用这样的事情:

NSData* dataImg = [NSData dataWithContentsOfFile:@"yourfile.png"];
UIImage* img = [UIImage imageWithData:dataImg];

为了更好的帮助,我需要知道如何开始你的表,还有其他功能。



文章来源: Memory not being released for MKMapView w/ ARC