Memory management 将UIPageviewController与UIWebview一起添加会在iPad3中造成意外内存崩溃,但在iPad2中工作正常
我正在开发iPad电子书类型的应用程序。我必须从web服务获取数据,并在应用程序开始时在webView中显示它。因此,在应用程序开始时,我使用UIWebview创建了一个UIViewController数组。当我在38-42页开始从一个页面遍历到另一个页面时,它会收到内存警告,并且仅在iPad3中崩溃,但在iPad2中工作正常 下面是代码。Memory management 将UIPageviewController与UIWebview一起添加会在iPad3中造成意外内存崩溃,但在iPad2中工作正常,memory-management,uiwebview,uipageviewcontroller,ipad-3,Memory Management,Uiwebview,Uipageviewcontroller,Ipad 3,我正在开发iPad电子书类型的应用程序。我必须从web服务获取数据,并在应用程序开始时在webView中显示它。因此,在应用程序开始时,我使用UIWebview创建了一个UIViewController数组。当我在38-42页开始从一个页面遍历到另一个页面时,它会收到内存警告,并且仅在iPad3中崩溃,但在iPad2中工作正常 下面是代码。 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOption
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
pageContent = [[NSMutableArray alloc] init];
for (int i=0;i<60; i++)
{
[self addwebviewINCode];
}
NSDictionary *options = [NSDictionary dictionaryWithObject:[NSNumber numberWithInteger:UIPageViewControllerSpineLocationMin] forKey: UIPageViewControllerOptionSpineLocationKey];
self.pageController = [[UIPageViewController alloc]
initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl
navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal
options: options];
pageController.dataSource = self;
pageController.delegate=self;
[[pageController view] setFrame:[[self.window.rootViewController view] bounds]];
UIViewController *viewC = [self viewControllerAtIndex:0];
NSArray *viewControllers = [NSArray arrayWithObject:viewC];
[pageController setViewControllers:viewControllers
direction:UIPageViewControllerNavigationDirectionForward
animated:NO
completion:nil];
[self.window.rootViewController addChildViewController:pageController];
[[self.window.rootViewController view] addSubview:[pageController view]];
[pageController didMoveToParentViewController:self.window.rootViewController];
[self.window makeKeyAndVisible];
return YES;
}
我正在使用UIViewController添加Webview
}
UIPageController委托方法
}
-(整数)indexOfViewController:(UIViewController*)viewController
{
返回[self.pageContent indexOfObject:viewController];
}
-(NSInteger)getVCIndex:(UIViewController*)viewCon
{
if([pageContent containsObject:viewCon]){
返回[pageContent indexOfObject:viewCon];
}
返回0;
}
为什么会发生这种情况,因为它在iPad2中工作正常,但只在iPad3中发出内存警告并崩溃
有人能帮我解决这个问题吗?我花了太多的时间来解决这个问题
谢谢看起来引用的代码在前面生成了所有视图控制器。应该只考虑UIPageViewController请求创建视图控制器。 对于初始设置ViewController:direction:animated:completion:call,向其发送一个数组,其中仅包含最初应显示的视图控制器(第一页) 在pageViewController:ViewControllerBeforeReviewController:和pageViewController:viewControllerAfterViewController:中,它将创建一个新的视图控制器,表示应在视图控制器中包含的内容传入参数之前或之后显示的内容,而不是将索引引用到数组中 通过这种方式,您不需要一次加载所有可能导致问题的页面(尤其是UIWebView)
-(void)addwebviewINCode
{
UIViewController *viewC = [[UIViewController alloc] initWithNibName:nil bundle:nil];
self.webVCustom = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, _window.bounds.size.width, 1004)];//20
self.webVCustom.suppressesIncrementalRendering=YES;
self.webVCustom.delegate=self;
self.webVCustom.scrollView.scrollEnabled=NO;
viewC.view=self.webVCustom;
[pageContent addObject:viewC];
- (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers {
pageAnimationFinished = YES;
}
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
if (flag == FALSE) {
NSUInteger index = [self indexOfViewController:viewController];
if ((index == 0) || (index == NSNotFound)) {
return nil;
}
index--;
return [self viewControllerAtIndex:index];
}else {
flag=FALSE;
}
return 0;
}
-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
if (flag == FALSE) {
NSUInteger index = [self indexOfViewController:viewController];
if (index == NSNotFound) {
return nil;
}
index++;
if (index == [self.pageContent count]) {
return nil;
}
return [self viewControllerAtIndex:index];
}else {
flag=FALSE;
}
return 0;
}
-(void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed
{
UIViewController *viewC = [previousViewControllers objectAtIndex:0];
NSInteger ind = [self getVCIndex:viewC];
NSInteger indCur = [self getVCIndex:[pageViewController.viewControllers objectAtIndex:0]];
if (ind == indCur) {
indCurrentView=ind;
}else {
indCurrentView=indCur;
}
if (completed || finished) // Turn is either finished or aborted
pageAnimationFinished = NO;
}
-(UIViewController *)viewControllerAtIndex:(NSUInteger)index
{
// Return the data view controller for the given index.
if ((index >= [self.pageContent count])) {
return nil;
}
// Create a new view controller and pass suitable data.
UIViewController viewC = (UIViewController)[pageContent objectAtIndex:index];
return viewC;