Что я должен искать, это может увеличить количество сохраняемых данных в UIViewController, который не освобождает - PullRequest
0 голосов
/ 25 марта 2012

У меня есть UIViewController, который извлекается из стека навигации на iPhone и удаляется с помощью setRootViewController на iPad.

В обоих случаях UIViewController не удаляется, что означает, что к нему что-то привязано; это подтверждается регистрацией [self retainCount], равной двум, непосредственно перед pop или setRootViewController (по какой-то причине в ViewWillDisappear четыре).

UIView имеет аудио (используя Flite Text to Speech - который использует AVFoundation.framework) и анимацию.

То, что я должен искать, может увеличить количество сохраняемых данных в контроллере представления и помешать контроллеру представления быть вежливо освобожденным, как и должно быть.

Вот как представление помещается в стек представления или устанавливается как RootViewController;

-(IBAction)pushShare:(id)sender{

    ShareViewController *shareViewController =  [[ShareViewController alloc] initWithNibName:@"ShareViewController" bundle:nil];
    NSLog(@"1. SVC Retain count %d", [shareViewController retainCount]);
    [shareViewController setParentIsIpadMake:YES];
    NSLog(@"2. SVC Retain count %d", [shareViewController retainCount]);    
    [shareViewController setStory:story];
    NSLog(@"3. SVC Retain count %d", [shareViewController retainCount]);      
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {      
        StoryBotAppDelegate *appDelegate = (StoryBotAppDelegate *)[[UIApplication sharedApplication] delegate];
        [appDelegate.window setRootViewController:shareViewController];
        NSLog(@"4. SVC Retain count %d", [shareViewController retainCount]);      
    } else{


        [self.navigationController pushViewController:shareViewController animated:YES];
        NSLog(@"4. SVC Retain count %d", [shareViewController retainCount]);      

    }

    NSLog(@"releasing Svc...");
    [shareViewController release];
    NSLog(@"5. SVC Retain count %d", [shareViewController retainCount]);

}

Ответы [ 3 ]

1 голос
/ 25 марта 2012

Метод сохранения счетчика практически бесполезен. Системные библиотеки сохранят ваш VC и освободят его. Вот почему иногда это будет странно высокое число. Об этом много тем.

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

Если вы тестируете в симуляторе, выведите предупреждение о памяти и посмотрите, не отменено ли оно. Dealloc'ed не всегда вызывается сразу, когда вы открываете ВК.

Запустить утечки приборов. Это говорит о том, что VC утечка памяти? Запустите инструменты с зомби, чтобы выяснить, протекает ли он.

1 голос
/ 25 марта 2012

Сначала попробуйте запустить статический анализатор XCode, он может обнаружить, что не так.

Вы также можете попробовать переопределить метод retain с помощью вызова [super retain] и регистрации. Более того, вы можете поставить точку останова и посмотреть на стек, когда Xcode останавливается на нем.

Или вы можете запустить инструмент преобразования ARC и посмотреть, что произойдет.

0 голосов
/ 27 марта 2012

Я прочитал этот вопрос о том, как NSTimer остановил освобождение UIView.Оказывается, у меня был NSTimer, который запускал мои анимации, что мешало удачно сработать.Я исправил это, добавив метод с именем killTimer:

-(void)killTimer{
    [animationTimer invalidate];
    animationTimer = nil;
}

, который я вызвал при закрытии представления.

Спасибо огромное за ответы на этот вопрос - они были очень полезными.На самом деле я не знал о статическом анализаторе до тех пор, пока не спросил - или о том, насколько бесполезны счетчики сохранения;так что +1 вам обоим.

...