UIPageControllerView回收页面减少了内存使用量

时间:2015-02-18 22:27:31

标签: ios swift uipagecontrol

我正在尝试实现Pagecontroller以水平顺序显示图像。但每次刷卡后内存越来越高。任何减少内存使用的解决方案? 我有100张图片,每张图片近200kb。但滚动时内存使用量可达800mb。

注意:它会在真实设备上发出内存警告,但app不会粉碎。

以下是我用来控制页面的类。

import UIKit

class PageViewController: UIViewController, UIPageViewControllerDataSource {

    // MARK: - Variables
    private var pageViewController: UIPageViewController?
    var contentImages = [String]()
    // Initialize it right away here

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

        for index in 0...93 {
           contentImages.append("pages-\(index).jpg")
        }

        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, 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 0
    }

}

项目控制器

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)
    }
}

2 个答案:

答案 0 :(得分:0)

如果使用imageNamed创建UIImage,则会缓存图像。您可以尝试其他一些构造函数方法而无需缓存。但通常图像缓存才有效。

例如,您可以尝试NSBundle.pathForResource(_:ofType:)UIImage.init(contentsOfFile:)

或者代码中存在某种内存泄漏。我不太了解Swift在您的代码中发现任何内容。

答案 1 :(得分:0)

这里发生的是UIImage(名为:)永远缓存您的图像数据。它真的,严肃地说,意味着仅用于a)小b)经常使用的c)你的界面必不可少的东西。

在Objective-C中你可以在内存方法上获得内存方法+ _flushSharedImageCache,或者你可以在你的控制器被dealloc'd时调用内部+ removeImageNameFromCache(imageName),如果有一些非常好的理由不打扰写你自己的缓存。

但是在Swift中,只需编写自己的缓存并在其中保留最多一些最近使用的图像,这很容易。当iPhone有128MB RAM时,我就是这样处理这类问题的:http://www.alexcurylo.com/blog/2009/01/13/imagenamed-is-evil/