Xcode 无法跟踪内存泄漏

Xcode 无法跟踪内存泄漏,xcode,debugging,memory-leaks,instruments,quartz-core,Xcode,Debugging,Memory Leaks,Instruments,Quartz Core,我目前正在尝试修复我的应用程序中的内存泄漏,它没有使用泄漏工具显示,因此我使用了分配工具的heapshot函数。我拍了几张照片,如下所示: 我正在执行的操作是从一个普通菜单更改视图->一个包含一个带有覆盖的MKMapView的菜单,然后再次更改 我已经检查过了,每次进入MKMapView时,内存都在增加。我在初始化时声明了MKMapView,并且包含MKMapView的视图在应用程序周期结束之前从未发布。所以这不应该是一个创作问题 如果我进入其中一张照片,我可以看到以下内容: if (!self

我目前正在尝试修复我的应用程序中的内存泄漏,它没有使用泄漏工具显示,因此我使用了分配工具的heapshot函数。我拍了几张照片,如下所示:

我正在执行的操作是从一个普通菜单更改视图->一个包含一个带有覆盖的MKMapView的菜单,然后再次更改

我已经检查过了,每次进入MKMapView时,内存都在增加。我在初始化时声明了MKMapView,并且包含MKMapView的视图在应用程序周期结束之前从未发布。所以这不应该是一个创作问题

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

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];
    }
每个内存地址如下所示:

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];
    }
我似乎不明白为什么会留下这么多的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只在第一次调用,因为我从未更改贴图类型

要退出地图,您必须单击地图pin上的DetailDisclosure按钮,该按钮调用以下代码:

- (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");
}

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

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

我已经检查过了,每次输入时,内存都在增加 MKMapView。我在初始化时声明MKMapView,并且 包含MKMapView的视图在任务结束之前不会发布 申请周期。所以这不应该是一个创作问题


你真的确定它不是每次都构造这个对象,而你只是在程序退出时才销毁它吗?这似乎是一个经典的对象生命周期混淆。

您需要发布一些代码,也许我正在执行的操作是从普通菜单更改视图->一个包含带有覆盖的MKMapView的菜单,然后再更改回来。此外,您还可以尝试静态内存分析器来跟踪静态泄漏。运行Xcode->Product->Analyze。嗨,我已经修改了上面的帖子,加入了代码。将有一个静态泄漏看看,谢谢你的建议!好的,我已经看过静态记忆分析仪,看起来我做错了很多,我认为这是我对自我的利用。在发布东西的时候。你能告诉我下面的代码是否正确吗:如果self.scrollDirections{[self.scrollDirections removeFromSuperview];[self.scrollDirections release];self.scrollDirections=nil;}嗨,我已经更新了我原来的帖子。我很确定它不会被创建两次,除非我感到困惑。我正在检查映射的常规创建属性,不会再次调用。只需记录构造函数并检查它是否被调用两次。我正在记录构造函数并在其中设置断点,因此绝对不会被调用两次。我真的不知道是什么在引用这些东西,有些东西的ref计数是5。所有反构造器都将在最后被调用,在过程中不应调用任何构造器,因为这是一个视图更改/取消。