2015-09-30 18 views
5

Tôi thiết lập UIPageViewController để chuyển tiếp và lùi qua một số bộ điều khiển xem. Tôi có một vấn đề là khi một bộ điều khiển xem thêm UIPageViewController việc sử dụng bộ nhớ sẽ tăng lên cho đến khi trình biên dịch cho tôi Received memory warning và sau đó ứng dụng chạy quá chậm cho đến khi ứng dụng làm trống bộ nhớ và hoạt động tốt trở lại. Làm cách nào để điều hướng qua bộ điều khiển chế độ xem mà không tăng bộ nhớ? hoặc tốt hơn để nói làm thế nào có thể loại bỏ điều khiển xem hiện tại khi một mới trên cho biết thêm. đây là mã của tôi:UIPageViewController và loại bỏ bộ điều khiển xem hiện tại

// Create the page view controller. 
self.pageViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageViewController"]; 
self.pageViewController.dataSource = self; 


//disabling tap and swipe guesture 
for (UIGestureRecognizer *recognizer in self.pageViewController.gestureRecognizers) { 
    recognizer.enabled = NO; 
} 


// Instantiate the first view controller. 
UIViewController *startingViewController = [self viewControllerAtIndex:0]; 

[self.pageViewController setViewControllers:@[startingViewController] 
            direction:UIPageViewControllerNavigationDirectionForward 
            animated:NO 
           completion:^(BOOL finished) { 
            // Completion code 
           }]; 

// Add the page view controller to this root view controller. 
[self addChildViewController:self.pageViewController]; 
[self.view addSubview:self.pageViewController.view]; 
[self.pageViewController didMoveToParentViewController:self]; 

Chuyển tiếp và hành động ngược:

- (void)goToPreviousContentViewController 
{ 

    // Get index of current view controller 
    UIViewController *currentViewController = [self.pageViewController.viewControllers objectAtIndex:0]; 
    NSString *vcRestorationID = currentViewController.restorationIdentifier; 
    NSUInteger index = [self.contentPageRestorationIDs indexOfObject:vcRestorationID]; 

    UIViewController *previousViewController = [self viewControllerAtIndex:index - 1]; 



    [self.pageViewController setViewControllers:@[previousViewController] 
             direction:UIPageViewControllerNavigationDirectionReverse 
             animated:NO 
            completion:^(BOOL finished) { 
             // Completion code 
            }]; 
} 

More Codes:

#pragma mark - UIPageViewControllerDataSource 
- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController 
{ 
    return self.contentPageRestorationIDs.count; 
} 





- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController 
{ 
    NSString *vcRestorationID = viewController.restorationIdentifier; 
    NSUInteger index = [self.contentPageRestorationIDs indexOfObject:vcRestorationID]; 

    if (index == 0) { 
     return nil; 
    } 

    return [self viewControllerAtIndex:index - 1]; 
} 




- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController 
{ 
    NSString *vcRestorationID = viewController.restorationIdentifier; 
    NSUInteger index = [self.contentPageRestorationIDs indexOfObject:vcRestorationID]; 

    if (index == self.contentPageRestorationIDs.count - 1) { 
     return nil; 
    } 

    return [self viewControllerAtIndex:index + 1]; 
} 






#pragma mark - Private Methods 
- (UIViewController *)viewControllerAtIndex:(NSUInteger)index 
{ 
    // Only process a valid index request. 
    if (index >= self.contentPageRestorationIDs.count) { 
     return nil; 
    } 

    // Create a new view controller. 
    BaseContentViewController *contentViewController = (BaseContentViewController *)[self.storyboard instantiateViewControllerWithIdentifier:self.contentPageRestorationIDs[index]]; 

    // Set any data needed by the VC here 
    contentViewController.rootViewController = self; 

    return contentViewController; 
} 

Trả lời

1

Tôi không thấy bất kỳ vấn đề bộ nhớ trong mã của bạn. Hãy thử sử dụng công cụ profiler gọi là "Rò rỉ" và cố gắng tìm đối tượng nào không được giải phóng khỏi bộ nhớ. Có official Apple guide cho rằng

6

Để trả lời câu hỏi của bạn

  1. "Làm sao tôi có thể điều hướng thông qua việc xem các bộ điều khiển mà không làm tăng trí nhớ?":

    Bạn có thể không thực sự làm điều đó. Khi bạn tải một bộ điều khiển xem mới, nó sẽ tải tất cả các khung nhìn và bộ điều khiển xem được lưu trong bộ nhớ. Bạn không thể tải và hiển thị bộ điều khiển chế độ xem không có trong bộ nhớ.

  2. "Làm thế nào có thể loại bỏ điều khiển xem hiện tại khi mới trên cho biết thêm":

    Bạn không nên làm điều đó. Bộ điều khiển xem trống không có bộ nhớ lớn, bạn có thể dễ dàng có hơn 20 bộ điều khiển xem trong ngăn điều hướng mà không gặp bất kỳ vấn đề nào về bộ nhớ. Mặc dù nó có thể thực hiện một cái gì đó như thế này, nó phải mất rất nhiều công việc, và nó không giải quyết gốc của vấn đề của bạn.

Vấn đề là gì?

Bạn gặp sự cố quản lý bộ nhớ. Nó không phải do mã bạn đã đăng, điều đó có vẻ ổn. Sự cố phải nằm trong một phần khác của mã của bạn.

Có hai trường hợp phổ biến mà có thể gây ra các vấn đề quản lý bộ nhớ:

  1. Giữ lại chu kỳ: Một duy trì chu kỳ cơ bản là khi hai đối tượng giữ lại lẫn nhau. Điều này đi ngược lại các quy tắc tiêu chuẩn về quyền sở hữu đối tượng, để lại cả hai đối tượng không có thẩm quyền giải phóng bộ nhớ khác, gây rò rỉ bộ nhớ (số là số lần giữ lại):

  2. Bộ nhớ đệm không cần thiết: Nếu bạn đang tải xuống rất nhiều hình ảnh và bộ nhớ đệm chúng, đó không phải là trường hợp sử dụng lý tưởng cho bộ nhớ đệm. Caching là lý tưởng để lưu trữ các đối tượng thường xuyên truy cập. Nếu bạn không thường xuyên truy cập những hình ảnh này hoặc nhận một thông điệp didReceiveMemoryWarning, bạn nên giải phóng các đối tượng này.

Làm thế nào bạn có thể gỡ lỗi bộ nhớ vấn đề

Điều đầu tiên và đơn giản nhất để làm là để ghi đè phương pháp dealloc bộ điều khiển quan điểm của. Việc ghi đè phương thức dealloc trên một viewcontroller sẽ giúp đảm bảo rằng một viewcontroller đang được deallocated khi bạn mong đợi nó được.

-(void)dealloc { 
    NSLog(@"viewcontroller is being deallocated"); 
} 

Nếu điều này không giúp bạn có thể thử cách ly sự cố và gỡ lỗi bằng công cụ Xcode. This bài viết có thể là một khởi đầu tốt cho bạn.

+0

tôi không tải về bất cứ điều gì, nhưng nhờ lời khuyên của bạn, tôi sẽ kiểm tra xem nó –

3

Để tránh bộ nhớ và quản lý bộ điều khiển chế độ xem, bạn cần phải ngăn xếp tất cả bộ điều khiển chế độ xem trong vùng chứa.

Để mọi cuộc gọi tiếp theo/trước đó sẽ được thực hiện trên vùng chứa đó và cuộc gọi sẽ cung cấp theo nhu cầu của bạn. Ngoài ra một lợi ích nữa của thùng chứa này là tránh điều khiển reinitialise một lần nữa và một lần nữa.

Khi bạn thêm bộ điều khiển chế độ xem trong vùng chứa, bạn không cần phân bổ init hoặc khởi tạo bộ điều khiển lần thứ hai.

Đó là một mã lớn để dán ở đây và cũng có thể thiết lập bảng phân cảnh sẽ không được nhìn thấy. Vì vậy, tôi chia sẻ cho bạn một bản demo để trực quan hóa và sử dụng bộ điều khiển trang với vùng chứa để giữ bộ điều khiển chế độ xem.

PageDemo

enter image description here

+0

Cảm ơn bạn, bạn đã thiết lập một bộ điều khiển Navigation cho mỗi Xem bộ điều khiển? nếu câu trả lời của bạn là CÓ, điều đó làm cho bảng phân cảnh của tôi phức tạp hơn! Tôi có 27 bộ điều khiển Xem! –

+0

Và tôi chỉ kiểm tra dự án của bạn trên thiết bị của tôi và kết quả là như nhau! , Trên thực tế mã của tôi hoạt động tốt nó làm trống bộ nhớ của nó tự, tôi chỉ muốn ngăn chặn cảnh báo bộ nhớ. –

+0

Điều ở đây là bộ điều khiển xem chỉ dành cho tất cả mục đích của bạn. Tôi có nghĩa là không cần phải thực hiện 27 bộ điều khiển xem trong Storyboard. Chỉ tạo một bộ điều khiển trong bảng phân cảnh và thay đổi chi tiết của nó dưới dạng thay đổi trang. – Kampai

Các vấn đề liên quan