2013-03-01 30 views
8

看來,UIPageViewController永遠持有初始內容視圖控制器。 例如:UIPageViewController內存泄漏

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; 

startingViewController永遠不會釋放,直到pageViewController它本身釋放。

要重現此錯誤,只需使用基於頁面的應用程序模板在XCode中創建一個新項目。並加入3行代碼爲DataViewController.m

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

而當你在滾動垂直方向的演示應用程序,你會得到這樣的記錄:

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]是從未釋放。

對此有何想法? 謝謝!

+0

你有沒有找到解決這個與ARC解決呢? – 2013-11-06 16:45:53

回答

-1

我有同樣的問題,解決了以下內容:

[startingViewController release];其中初始化的終點。

然後第一個ViewController將被釋放。

+2

但是我使用ARC ... – 2013-07-05 09:36:11

3

您是否使用transitionStyle UIPageViewControllerTransitionStyleScroll?我遇到了使用頁面捲曲動畫時似乎消失的相同或類似問題。

這個問題對我來說很複雜,因爲我允許UISliderBar在內容中設置位置。所以在改變UISliderBar時,我打電話給setViewControllers:direction:animated:completion:這導致越來越多的視圖控制器引用在我的UIPageViewController中「卡住」。

我也在使用ARC。我還沒有找到一種可接受的方式來強制UIPageViewController放棄額外的視圖控制器引用。我可能最終會使用頁面curl轉換或使用啓用了分頁的UIScrollView實現我自己的UIPageViewController等效,因此我可以管理自己的視圖控制器緩存而不是依賴UIPageViewController的破壞視圖控制器管理。

+0

是的,我正在使用滾動樣式。我實現了自己的PageView,因爲沒有任何開源實現符合我的要求。 – 2013-12-07 04:08:36

3

我不確定你是否仍然有問題,但我遇到同樣的問題,我找到了解決方案。

我不知道原因,但它的工作原理。

我在addSubview之後設置第一個viewController,而不是在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]; 
}  
} 

第一個viewController會在正確的時間釋放。

另外,我發現如果在呼叫

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

addSubView前完成塊不會叫。

我想這塊是第一個viewController沒有釋放的原因。

我會去找出它爲什麼沒有回調,完善答案〜

歡呼

+0

這個應該被接受。 – 2015-09-02 16:47:22

+0

是的,這是我工作的唯一解決方案!文檔沒有聲明這是一個需求,但這是我獲得dealloc被調用的唯一途徑。 – 2017-03-27 06:01:33

1

嘗試幾次後,搞清楚發生了什麼事就類似的問題,我注意到,在我的項目有2個導致保留問題的原因,導致UIPageViewController被永久保留。

1)有在UIPageViewController和呈獻給所述的UIViewController之間循環引用(這是固定在這兩個類從強改變的屬性,以弱)

2)和主固定在改變

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

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

我希望這可以幫助別人

0

同樣的問題,在這裏我 通過保持變量 我最初的viewController和,而不是建立在特定的PageIndex相同的VC,我只是重複使用它

+0

你能幫助我的代碼片段?提前致謝。 – Ashik 2017-01-30 11:33:07