我希望能够卸载UIPageVIEwController所需的所有页面 – 前一页,当前页和下一页.我怎样才能卸载不需要的页面,因为它们是由UIPageVIEwController实例化的.
下面是UIPageVIEwController从中提取的页面数组.所有页面(Page1,Page2等)基本上只是加载图像文件,提供基本动画和音乐.
//ARRAY OF PAGES pageArray = [[NSArray alloc] initWithObjects: (ID)[[Page1 alloc] initWithNibname:nil bundle:nil],[[Page2 alloc] initWithNibname:nil bundle:nil],[[Page3 alloc] initWithNibname:nil bundle:nil],[[Page4 alloc] initWithNibname:nil bundle:nil],[[Page5 alloc] initWithNibname:nil bundle:nil],[[Page6 alloc] initWithNibname:nil bundle:nil],[[Page7 alloc] initWithNibname:nil bundle:nil],[[Page8 alloc] initWithNibname:nil bundle:nil],// continues all the way up to page 47 [[Page47 alloc] initWithNibname:nil bundle:nil],nil];
我遗漏了UIPageVIEwController的标准初始化.它使用“nextPageNumber”从上面的pageArray中拉出右页以创建新的页面对象.
-(voID)turnPageForward{[pageController setVIEwControllers:[NSArray arrayWithObject:[pageArray objectAtIndex:nextPageNumber]] direction:UIPageVIEwControllerNavigationDirectionForward animated:YES completion:^(BOol finished){ }];
}
我尝试创建一个对象“pageIndex”(见下文),在将其提供给pageController后设置为nil.它没用.页面提升后,页面仍然可以很好地占用内存.
//PROGRAM PAGE FORWARD
– (无效)turnPageForward {
UIVIEwController * pageIndex =[pageArray objectAtIndex:nextPageNumber]; //nextPageNumber is the next page to load[pageController setVIEwControllers:[NSArray arrayWithObject:pageIndex] direction:UIPageVIEwControllerNavigationDirectionForward animated:YES completion:^(BOol finished){ }]; pageIndex = nil;
}
我通过stackoverflow查看帖子使用相同的方式向UIPageVIEwController提供页面,但没有发现任何接近.最接近的是“ARC在导航控制器中返回”时没有释放内存,但是没有以相同的方式设置视图控制器.
我试图将不需要的页面设置为零,因此ARC可以删除它们而没有运气.我应该尝试任何建议或替代路径?我喜欢页面卷曲效果,并且无法在其他地方找到一个好的水平页面卷发.
谢谢!埃里克
解决方法 “UIPageVIEwController似乎保持每个页面在内存中实例化”不,你是通过实例化所有那些“页面”(控制器),并将它们放入一个数组(当你翻页时内存跳转,因为控制器的视图实际上没有加载,直到你显示它,即使控制器已经实例化了.但是一旦你完成了,你的控制器就会保留它的视图并且数组会保留控制器).你只需要保留一些你所在页面的数量,并在vIEwControllerBeforeVIEwController:和vIEwControllerAfterVIEwController:的实现中,在那里实例化一个页面.当您离开该页面时,其控制器将被取消分配.如果加载速度很慢,您可能需要保留一个包含当前页面的数组以及之前和之后的数组 – 如果您将其设置为滚动而不是页面卷曲以进行转换,则UIPageVIEwController会执行此 *** 作.
我做了一个像这样的简单测试应用程序:
@implementation VIEwController { int count;}- (voID)vIEwDIDLoad{ [super vIEwDIDLoad]; count = 1; self.pager = [[UIPageVIEwController alloc]initWithTransitionStyle:UIPageVIEwControllerTransitionStylePageCurl navigationorIEntation:UIPageVIEwControllerNavigationDirectionForward options:nil]; self.pager.dataSource = self; self.pager.delegate = self; Page1 *first = [[Page1 alloc] initWithNibname:@"Page1" bundle:nil]; [self.pager setVIEwControllers:@[first] direction:UIPageVIEwControllerNavigationDirectionForward animated:NO completion:nil]; [self addChildVIEwController:self.pager]; [self.vIEw addSubvIEw:self.pager.vIEw]; [self.pager dIDMovetoParentVIEwController:self];}-(UIVIEwController *)pageVIEwController:(UIPageVIEwController *)pageVIEwController vIEwControllerBeforeVIEwController:(UIVIEwController *)vIEwController { if (count > 1) { Nsstring *nibname = [@"Page" stringByAppendingFormat:@"%d",count-1]; UIVIEwController *prev = [[NSClassFromString(nibname) alloc] initWithNibname:nibname bundle:nil]; count -= 1; return prev; } return nil;}-(UIVIEwController *)pageVIEwController:(UIPageVIEwController *)pageVIEwController vIEwControllerAfterVIEwController:(UIVIEwController *)vIEwController { if (count < 3) { Nsstring *nibname = [@"Page" stringByAppendingFormat:@"%d",count+1]; UIVIEwController *next = [[NSClassFromString(nibname) alloc] initWithNibname:nibname bundle:nil]; count += 1; return next; } return nil;}
我的例子只有3页,但它说明了一种方法.我将日志放在3个控制器的dealloc方法中,当我离开它们时它们被调用.
总结以上是内存溢出为你收集整理的ios – 在UIPageViewController中释放未使用的页面全部内容,希望文章能够帮你解决ios – 在UIPageViewController中释放未使用的页面所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)