【问题标题】:Is there a way to deallocate a page in uipageviewcontroller after being swiped in swift ios?在 swift ios 中滑动后,有没有办法在 uipageviewcontroller 中释放页面?
【发布时间】:2015-11-02 02:18:03
【问题描述】:

我是 Swift iOS 的新手,我只是想问一下是否有办法在滑动后删除或取消分配页面,因为每次滑动到下一页时它都会消耗太多内存。我正在处理 64 页,所以如果我不应用解除分配,那么应用程序可能会冻结或崩溃。

ViewController.swift

import UIKit

class ViewController: UIViewController, UIPageViewControllerDataSource {

// MARK: - Variables
private var pageViewController: UIPageViewController?

// Initialize it right away here
private var contentImages = [
    "CQ print version_Page_1.jpg",
    "CQ print version_Page_2.jpg",
    "CQ print version_Page_3.jpg",
    "CQ print version_Page_4.jpg",
    "CQ print version_Page_5.jpg",
    "CQ print version_Page_6.jpg",
    "CQ print version_Page_7.jpg",
    "CQ print version_Page_8.jpg",
    "CQ print version_Page_9.jpg",
    "CQ print version_Page_10.jpg",
    "CQ print version_Page_11.jpg",
    "CQ print version_Page_12.jpg",
    "CQ print version_Page_13.jpg",
    "CQ print version_Page_14.jpg",
    "CQ print version_Page_15.jpg",
    "CQ print version_Page_16.jpg",
    "CQ print version_Page_17.jpg",
    "CQ print version_Page_18.jpg",
    "CQ print version_Page_19.jpg",
    "CQ print version_Page_20.jpg",
    "CQ print version_Page_21.jpg",
    "CQ print version_Page_22.jpg",
    "CQ print version_Page_23.jpg",
    "CQ print version_Page_24.jpg",
    "CQ print version_Page_25.jpg",
    "CQ print version_Page_26.jpg",
    "CQ print version_Page_27.jpg",
    "CQ print version_Page_28.jpg",
    "CQ print version_Page_29.jpg",
    "CQ print version_Page_30.jpg",
    "CQ print version_Page_31.jpg",
    "CQ print version_Page_32.jpg",
    "CQ print version_Page_33.jpg",
    "CQ print version_Page_34.jpg",
    "CQ print version_Page_35.jpg",
    "CQ print version_Page_36.jpg",
    "CQ print version_Page_37.jpg",
    "CQ print version_Page_38.jpg",
    "CQ print version_Page_39.jpg",
    "CQ print version_Page_40.jpg",
    "CQ print version_Page_41.jpg",
    "CQ print version_Page_42.jpg",
    "CQ print version_Page_43.jpg",
    "CQ print version_Page_44.jpg",
    "CQ print version_Page_45.jpg",
    "CQ print version_Page_46.jpg",
    "CQ print version_Page_47.jpg",
    "CQ print version_Page_48.jpg",
    "CQ print version_Page_49.jpg",
    "CQ print version_Page_50.jpg",
    "CQ print version_Page_51.jpg",
    "CQ print version_Page_52.jpg",
    "CQ print version_Page_53.jpg",
    "CQ print version_Page_54.jpg",
    "CQ print version_Page_55.jpg",
    "CQ print version_Page_56.jpg",
    "CQ print version_Page_57.jpg",
    "CQ print version_Page_58.jpg",
    "CQ print version_Page_59.jpg",
    "CQ print version_Page_60.jpg",
    "CQ print version_Page_61.jpg",
    "CQ print version_Page_62.jpg",
    "CQ print version_Page_63.jpg",
    "CQ print version_Page_64.jpg"];

    //var contentImages = [String]()

// MARK: - View Lifecycle
override func viewDidLoad() {
    super.viewDidLoad()
    createPageViewController()
    setupPageControl()
}

private func createPageViewController() {

    let pageController = self.storyboard!.instantiateViewControllerWithIdentifier("PageController") as! UIPageViewController
    pageController.dataSource = self

    if contentImages.count > 0 {
        let firstController = getItemController(0)!
        let startingViewControllers: NSArray = [firstController]
        pageController.setViewControllers(startingViewControllers as [AnyObject], direction: UIPageViewControllerNavigationDirection.Forward, animated: false, completion: nil)
    }

    pageViewController = pageController
    addChildViewController(pageViewController!)
    self.view.addSubview(pageViewController!.view)
    pageViewController!.didMoveToParentViewController(self)
}

private func setupPageControl() {
    let appearance = UIPageControl.appearance()
    appearance.pageIndicatorTintColor = UIColor.grayColor()
    appearance.currentPageIndicatorTintColor = UIColor.whiteColor()
    appearance.backgroundColor = UIColor.darkGrayColor()
}

// MARK: - UIPageViewControllerDataSource

func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {

    let itemController = viewController as! PageItemController

    if itemController.itemIndex > 0 {
        return getItemController(itemController.itemIndex-1)
    }

    return nil
}

func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {

    let itemController = viewController as! PageItemController

    if itemController.itemIndex+1 < contentImages.count {
        return getItemController(itemController.itemIndex+1)
    }

    return nil
}

private func getItemController(itemIndex: Int) -> PageItemController? {

    if itemIndex < contentImages.count {
        let pageItemController = self.storyboard!.instantiateViewControllerWithIdentifier("ItemController") as! PageItemController
        pageItemController.itemIndex = itemIndex
        pageItemController.imageName = contentImages[itemIndex]
        return pageItemController
    }

    return nil
}

// MARK: - Page Indicator

func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int {
    return contentImages.count
}

func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int {
    return contentImages.count
   }

}

PageItemController.swift

import UIKit

class PageItemController: UIViewController {

// MARK: - Variables
var itemIndex: Int = 0
var imageName: String = "" {

    didSet {

        if let imageView = contentImageView {
            imageView.image = UIImage(named: imageName)
        }

    }
}

@IBOutlet var contentImageView: UIImageView?

// MARK: - View Lifecycle
override func viewDidLoad() {
    super.viewDidLoad()
    contentImageView!.image = UIImage(named: imageName)
   }
}

【问题讨论】:

  • AFAIK UIPageViewController 仅保留对可见控制器的引用(您是否检查过它们是否被释放?)。内存使用量增加可能是由图像缓存引起的 - 当内存太低时应该清理它。
  • 是的,是图像缓存导致了内存泄漏。有没有办法在刷卡后清理或取消分配图像?

标签: ios swift xcode6.4


【解决方案1】:

如果此内存问题与图像有关,那么,

正如文档所说:

如果您有一个只显示一次的图像文件并希望 确保它不会被添加到系统的缓存中,您应该 而是使用 imageWithContentsOfFile: 创建您的图像。这会 将您的一次性图像保留在系统图像缓存之外,可能 改善应用的内存使用特性。

所以不要使用

contentImageView!.image = UIImage(named: imageName)

你应该使用

contentImageView!.image = UIImage(contentsOfFile: imageName)

更多内存管理概念可以参考这个链接:Swift Managing Memory

【讨论】:

    猜你喜欢
    • 2019-08-29
    • 2010-09-12
    • 2013-09-24
    • 2013-01-23
    • 2017-11-04
    • 2021-12-13
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    相关资源
    最近更新 更多