无法追踪内存泄漏

时间:2012-06-29 13:44:26

标签: xcode debugging memory-leaks instruments quartz-core

我目前正在尝试修复应用程序中的内存泄漏(它没有显示使用泄漏工具),所以我使用了Allocations工具的快照功能。我已经采取了几个快照,如下所示:

heapshots

我正在执行的操作是从普通菜单更改视图 - >一个包含MKMapView(带有叠加层)并再次返回。

我已经检查过,每次进入MKMapView时内存都在增加。我在初始化时声明MKMapView一次,并且包含MKMapView的视图在应用程序循环结束之前永远不会释放。所以它不应该是一个创造问题。

如果我进入其中一个快照,我可以看到以下内容:

Broken down heapshots

并且每个内存地址如下所示:

Memory address

我似乎无法弄清楚为什么会留下如此多的QuartzCore开销,更不用说为什么每次显示视图时都会创建它。任何人都可以告诉我是否有办法看到哪个对象直接调用此对象,或者哪个对象保留它?这会造成足够的内存泄漏,最终导致我的应用程序崩溃,但我似乎无法修复它。

编辑:

好的,这是我的一些代码(它是一个很大的代码所以会尝试显示选择位):

首先在菜单中按下地图按钮时调用它:

[self presentModalViewController:[dictionaryViews objectForKey:kMapView] animated:NO];

然后加载映射,调用的代码如下:

- (void)viewDidAppear:(BOOL)animated
{
    if (self.mkMapView)
    {
        [self changeMapOverlay:14];

    Singleton *singleton = [Singleton sharedSingleton];

    if ([singleton.storyLocation isEqualToString:kGunthorpe])
    {
        CustomAlertView *alert = [[CustomAlertView alloc] initWithTitle:@"Map" message:@"Once you are ready to visit your first location touch the green pin and press the play button. If you are walking the streets use the directions tab to guide you." delegate:self cancelButtonTitle:@"Okay" otherButtonTitles:nil];
        [alert show];
        [alert release];

        //int i =0;
    }

    // Setup for 30 fps
    float fps = 1.0 / 30.0;
    self.timerMap = [NSTimer scheduledTimerWithTimeInterval:fps target:self selector:@selector(mapLoop) userInfo:nil repeats:YES];  
}
}

然后调用changeOverlay函数执行以下操作:

if (!self.mkMapOverlay)
    {
        MapOverlay *mapOverlay = [[MapOverlay alloc] init];
        [self.mkMapView addOverlay:mapOverlay];
        self.mkMapOverlay = mapOverlay;
        [mapOverlay release];

        mkOverlayRect = MKMapRectMake([self.mkMapOverlayView.overlay boundingMapRect].origin.x, [self.mkMapOverlayView.overlay boundingMapRect].origin.y, [self.mkMapOverlayView.overlay boundingMapRect].size.width, [self.mkMapOverlayView.overlay boundingMapRect].size.height);
    }
    else 
    {
        [self.mkMapOverlayView setHidden:FALSE];
    }

这是为了确保地图使用叠加层作为默认视图(它可以更改为混合和正常)。 - 我已经检查过,mapOverlay只会在第一次被调用,因为我从不更改地图类型。

要退出地图,您必须在地图引脚上单击detailDisclosureButton,它会调用以下代码:

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
//NSLog(@"Annotation view selected - Start");
MapAnnotation *annotation = (MapAnnotation *)view.annotation;
NSString *locationName = [[NSString alloc] initWithString:[NSString stringWithString:annotation.title]];

if ([annotation.title rangeOfString:@"."].location != NSNotFound) 
{
    NSRange range = [locationName rangeOfString:@". "];
    int test = range.location + range.length;

    NSString *locationName2 = [[NSString alloc] initWithString:[locationName substringFromIndex:test]];

    [[NSNotificationCenter defaultCenter] 
     postNotificationName:@"GotoLocation" 
     object:locationName2];

    [locationName2 release];
    locationName2 = nil;
}

[locationName release];
locationName = nil;

[mapView deselectAnnotation:annotation animated:NO];

[self dismissModalViewControllerAnimated:NO];
//NSLog(@"Annotation view selected - Finish");
}

我可以解释上面的任何代码,但基本上注释都有一个标题,我需要删除数字才能到达正确的位置。

1 个答案:

答案 0 :(得分:0)

我没有在Mac上编程,但这非常可疑:

  

我已经检查过,每次进入时内存都在增加   的MKMapView。我在初始化时声明MKMapView,并且   包含MKMapView的视图永远不会发布,直到结束   申请周期。所以它不应该是一个创造问题。

你真的确定它不是每次都构造这个对象,并且只有在程序退出时才会破坏它吗?这似乎是一个经典的对象终生混乱。