2013-03-01 18 views
8

Es scheint, dass UIPageViewController hält den ursprünglichen Content-View-Controller für immer. Zum Beispiel:UIPageViewController Speicherleck

DataViewController *startingViewController = [self.modelController viewControllerAtIndex:0 storyboard:self.storyboard]; 
NSArray *viewControllers = @[startingViewController]; 
[self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:NULL]; 
self.pageViewController.dataSource = self.modelController; 

Die startingViewController nie, bis die pageViewController selbst veröffentlicht sie veröffentlicht.

Um diesen Fehler zu reproduzieren, erstellen Sie einfach ein neues Projekt in XCode mit der Vorlage für seitenbasierte Anwendungen. Und fügen Sie 3 Zeilen Code in DataViewController.m

@property NSInteger debugIndex; // file scope 
NSLog(@"DataViewController[%d] created", self.debugIndex); // in viewDidLoad 
NSLog(@"DataViewController[%d] dealloc", self.debugIndex); // in dealloc 

Und wenn Sie die Demo blättern App in vertikaler Ausrichtung, werden Sie Protokolle wie diese:

DataViewController[0] created 
DataViewController[1] created 
DataViewController[2] created 
DataViewController[1] dealloc 
DataViewController[3] created 
DataViewController[2] dealloc 
DataViewController[4] created 
DataViewController[3] dealloc 
DataViewController[5] created 
DataViewController[4] dealloc 
DataViewController[6] created 
DataViewController[5] dealloc 

DataViewController [0] ist nie freigegeben.

Irgendwelche Ideen dazu? Danke!

+0

Haben Sie jemals eine Lösung für diesen mit ARC finden? –

Antwort

-1

ich gleiche Problem hatte und löste das folgende:

[startingViewController release]; wo der Endpunkt der Initialisierung.

dann wird der erste ViewController freigegeben.

+2

Aber ich benutze ARC ... –

3

Verwenden Sie transitionStyle UIPageViewControllerTransitionStyleScroll? Ich stieß auf das gleiche oder ein ähnliches Problem, das bei der Verwendung von Page-Curl-Animationen zu verschwinden schien.

Das Problem wurde für mich compoundiert, weil ich einer UISliderBar erlaubte, die Position im Inhalt festzulegen. Also habe ich beim Wechsel der UISliderBar setViewControllers aufgerufen: direction: animated: completion: was dazu geführt hat, dass mehr und mehr View Controller-Referenzen in meinem UIPageViewController "stecken geblieben" sind.

Ich verwende auch ARC. Ich habe keinen akzeptablen Weg gefunden, den UIPageViewController dazu zu zwingen, die zusätzlichen View-Controller-Referenzen loszulassen. Ich werde wahrscheinlich entweder den Seiten-Curl-Übergang verwenden oder mein eigenes UIPageViewController-Äquivalent implementieren, indem ich ein UIScrollView mit aktiviertem Paging benutze, damit ich meinen eigenen View-Controller-Cache verwalten kann, anstatt auf die Verwaltung von gebrochenen View-Controllern von UIPageViewController angewiesen zu sein.

+0

Ja, ich benutze den Scroll-Stil. Ich habe mein eigenes PageView implementiert, da keine Open-Source-Implementierung meinen Anforderungen entspricht. –

3

Ich bin mir nicht sicher, dass Sie immer noch das Problem hatten, aber ich hatte das gleiche Problem und ich fand die Lösung.

Ich weiß nicht den Grund, aber es funktioniert.

Ich setze den ersten ViewController direkt nach addSubview statt vor addChlidViewController.

-(void)settingPageViewController{ 
if (!self.pageViewController) { 
    self.pageViewController = [[UIPageViewController alloc]initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil]; 
    self.pageViewController.delegate = self; 
    self.pageViewController.dataSource = self; 
    [self addChildViewController:self.pageViewController]; 
    [self.pageViewController didMoveToParentViewController:self]; 
    [self.containerView addSubview:self.pageViewController.view]; 
    [self.pageViewController setViewControllers:@[[self viewcontrollerAtIndex:0]] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil]; 
}  
} 

und der erste ViewController wird zur richtigen Zeit dealloc.

auch, fand ich, wenn Anruf

 [self.pageViewController setViewControllers:@[[self viewcontrollerAtIndex:0]] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:^(BOOL finished){ 
     NSLog(@"finished : %d",finished); 
    }]; 

vor addSubView und der Abschluss-Block wird nicht nennen.

und ich denke, dieser Block ist der Grund, warum der erste ViewController nicht dealloc.

gehe ich werde herausfinden, warum es nicht um Rückruf und verbessern die Antwort ~

prost

+0

Dieser sollte akzeptiert werden. –

+0

Ja, das ist die einzige Lösung, die auch für mich funktioniert hat! Die Dokumentation stellt dies nicht als eine Anforderung dar, aber dies war der einzige Weg für mich, dass die Dealloc aufgerufen wurde. –

1

Nach einigen Versuchen, herauszufinden, was auf einem ähnlichen Problem geschah, bemerkte ich, dass in Mein Projekt gab es zwei Gründe, die ein Retain-Problem verursacht haben und dazu geführt haben, dass ein UIPageViewController für immer beibehalten wurde.

1) gab es einen kreisförmigen Bezug zwischen dem UIPageViewController und dem Uiviewcontroller, die präsentiert wurde (dies durch eine Änderung der Eigenschaften zu schwach in beiden Klassen von starken fixiert wurde)

2) und die Haupt fix bestand

in wechselnden
[self setViewControllers:@[initialDetailsViewController] direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil]; 

zu

__weak __typeof__(self) weakSelf = self; 
    [weakSelf setViewControllers:@[initialDetailsViewController] direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil]; 

ich hoffe, das jemand

hilft 0
0

gleiches Problem hier i aufgelöst es von meinem ersten Viewcontroller in den Variablen zu halten und statt den gleichen vc auf bestimmten pageindex Schaffung ich es einfach wieder verwenden

+0

können Sie mir mit dem Codeausschnitt helfen? Danke im Voraus. – Ashik