2012-06-29 3 views
0

В настоящее время я пытаюсь исправить утечку памяти в своем приложении (она не появляется с помощью инструмента утечки), поэтому я использую функцию heapshot инструмента Allocations. Я взял несколько heapshots, как показано ниже:Не удается отследить утечку памяти

heapshots

Действие Я выполняю это изменение мнения нормального меню -> один содержащий MKMapView (с наложением) и обратно.

Я проверил и память увеличивается каждый раз, когда я вхожу в MKMapView. Я объявляю MKMapView один раз при инициализации, и представление, содержащее MKMapView, никогда не выпускается до конца цикла приложения. Поэтому это не должно быть проблемой создания.

Если я иду в один из heapshots я могу увидеть следующее:

Broken down heapshots

и каждый из адресов памяти выглядеть следующим образом:

Memory address

Я могу» t, похоже, выясняет, почему так много накладных расходов QuartzCore остается, не говоря уже о том, почему он создается каждый раз, когда отображается представление. Может ли кто-нибудь сказать мне, есть ли способ увидеть, какой объект непосредственно вызывает это или какой объект его сохраняет? Это создает достаточно утечки памяти, чтобы в конечном итоге свернуть приложение, но я не могу его исправить.

EDIT:

Хорошо вот некоторые из моего кода (это большой код так будет пытаться показать селективные биты):

Во-первых, в меню это вызывается при нажатии кнопки карта:

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

Я могу объяснить любого из кода выше, но в основном аннотации имеют название, которое я необходимо отключить номера, чтобы перейти в нужное место.

+0

Вам необходимо опубликовать код, возможно, фрагменты, которые делают это «Действие, которое я выполняю, меняет вид из обычного меню ->, содержащий MKMapView (с наложением) и обратно». бывает. – trumpetlicks

+0

также вы можете попробовать статический анализатор памяти для первого отслеживания статических утечек. Запустите Xcode -> Продукт -> Анализ. – rishi

+0

Привет, я исправил свой пост выше, чтобы включить код. Будем искать статические утечки, спасибо за совет! –

ответ

0

Я не программировать на Mac, но это крайне подозрительно:

Я проверил и память увеличивается каждый раз, когда я вхожу в MKMapView.Я объявляю MKMapView один раз при инициализации, а вид , содержащий MKMapView, никогда не выпускается до конца цикла приложения . Поэтому это не должно быть проблемой создания.

ВЫ ДЕЙСТВИТЕЛЬНО уверены, что он НЕ строит этот объект каждый раз, и вы уничтожаете его только тогда, когда программа завершается? Кажется, это классическая путаница жизни объекта.

+0

Привет, я обновил свое оригинальное сообщение. Я почти уверен, что он не создается дважды, если я не запутался. Я проверяю общие свойства создания карты, и это еще не вызвано. –

+0

Просто зарегистрируйте конструктор и проверьте, вызывается ли он дважды. – Spidey

+0

Я регистрирую конструктор и устанавливаю в нем точки останова, поэтому он определенно не вызывается дважды. Я не могу отследить, что держит ссылку на эти вещи (у некоторых есть количество ссылок 5). Все конструкторы вызываются в конце, и никакой конструктор не следует вызывать во время, поскольку это изменение/увольнение вида. –

Смежные вопросы