2016-07-03 3 views
1

У меня есть проект ios/swift, где я размещаю много UIImageViews в scrollview. У меня есть несколько scrollviews, и я хочу убедиться, что вся память выпущена, когда я закрываю ее. До сих пор кажется, что если я добавлю UIImage, он получит 16 ссылок со следующим кодом. Если я запустил его на любом устройстве, у него закончится память и произойдет сбой.swift: ARC: как выпустить все ссылки на UIImage

import UIKit 

class ViewController: UIViewController 
{ 

    var scrollView: UIScrollView? 
    var backgroundView:UIImageView? 
    var background:UIImage? 

    override func viewDidLoad() 
    { 
     super.viewDidLoad() 
     for i in 1 ..< 10000 
     { 
      print(i) 
      scrollView = UIScrollView(frame: CGRect(x: 0, y: 0, width: 1000, height: 1000)) 
      view.addSubview(scrollView!) 

      if let backgroundPath = NSBundle.mainBundle().pathForResource("1", ofType: "jpg") 
      { 
       background = UIImage(contentsOfFile: backgroundPath)! 
      } 

      backgroundView = UIImageView(image: background) 

      backgroundView?.frame = CGRect(x: 100, y: 500, width: 500, height: 500) 
      scrollView?.addSubview(backgroundView!) 

      print(CFGetRetainCount(background!)) 
      print(CFGetRetainCount(backgroundView!)) 
      print(CFGetRetainCount(scrollView!)) 

      scrollView!.contentSize = CGSize(width: 500, height: view.frame.height) 

      backgroundView = nil 
      scrollView = nil 
      background = nil 
     } 
    } 
} 

Как получить ссылочный счетчик нуля для освобождения памяти? Благодаря!

ответ

0

Только 16 ссылок? Этот код создает 9999 просмотров прокрутки (каждый раз, оставляя предыдущий в иерархии представлений, но оставляя ссылку на него на следующей итерации), каждая со своей собственной копией 1.jpg и каждая добавляется как подзаголовок view. Что касается освобождения памяти, вы должны удалить любые сильные ссылки, которые у вас есть, а также удалить любые другие ссылки, такие как иерархия представлений.

Итак, если вы хотите, чтобы удалить ссылки на изображения, вы можете сбросить image свойство UIImageView и/или удалить UIImageView (или UIScrollView) с точки зрения иерархии.

Обратите внимание, ваши попытки установить backgroundView и scrollView для nil удалить сильные ссылки на них, но называется addSubview раньше, поэтому иерархия зрения до сих пор сильная ссылка на них. Если вы хотите избавиться от всего, перед установкой scrollView в nil, не забудьте позвонить scrollView.removeFromSuperview(), чтобы удалить его из иерархии.

+0

Я имею в виду 16 ссылок на UIImage. У меня создалось впечатление, что установка UIImageView, Scrollview и UIImage на ноль очистит их ссылки, но это, похоже, не происходит. Я попытаюсь полностью удалить их из представления. – timfi

+0

Установка этих параметров на 'nil' удаляет ваши сильные ссылки на них, но когда вы вызываете' addSubview', вы добавили их в иерархию представлений, которая поддерживает свои собственные сильные ссылки. Вы должны «removeFromSuperview», чтобы удалить его из иерархии представлений и разрешить те последние оставшиеся сильные ссылки. – Rob

+0

спасибо, потребовалось время, чтобы реализовать в моем фактическом проекте, но мои проблемы окончены! вес моих плеч, близкий срок: – timfi

Смежные вопросы