swift:ARC: 如何释放对 UIImage 的所有引用
swift:ARC: how to release all references to an UIImage
我有一个 ios/swift 项目,我在滚动视图中放置了很多 UIImageView。我有多个滚动视图,我想确保在关闭一个时释放所有内存。到目前为止,如果我添加一个 UIImage,它会通过以下代码获得 16 个引用。如果我 运行 它在任何设备上 运行 内存不足并崩溃。
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
}
}
}
如何让引用计数为零来释放内存?谢谢!
只有 16 个参考文献?此代码创建 9,999 个滚动视图(每次都将前一个留在视图层次结构中,但在下一次迭代时放弃对它的引用),每个都有自己的 1.jpg
副本,并且每个都作为子视图添加view
。关于如何释放内存,您应该删除所有强引用,以及删除任何其他引用,例如视图层次结构。
因此,如果您想删除对图像的引用,您可以重置 image
属性 或 UIImageView
,and/or 删除 UIImageView
(或 UIScrollView
)来自视图层次结构。
请注意,您将 backgroundView
和 scrollView
设置为 nil
的尝试删除了对它们的强引用,但之前调用了 addSubview
,因此视图层次结构仍然具有对他们的强烈参考。如果你想摆脱一切,在将 scrollView
设置为 nil
之前,确保调用 scrollView.removeFromSuperview()
以将其从视图层次结构中删除。
我有一个 ios/swift 项目,我在滚动视图中放置了很多 UIImageView。我有多个滚动视图,我想确保在关闭一个时释放所有内存。到目前为止,如果我添加一个 UIImage,它会通过以下代码获得 16 个引用。如果我 运行 它在任何设备上 运行 内存不足并崩溃。
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
}
}
}
如何让引用计数为零来释放内存?谢谢!
只有 16 个参考文献?此代码创建 9,999 个滚动视图(每次都将前一个留在视图层次结构中,但在下一次迭代时放弃对它的引用),每个都有自己的 1.jpg
副本,并且每个都作为子视图添加view
。关于如何释放内存,您应该删除所有强引用,以及删除任何其他引用,例如视图层次结构。
因此,如果您想删除对图像的引用,您可以重置 image
属性 或 UIImageView
,and/or 删除 UIImageView
(或 UIScrollView
)来自视图层次结构。
请注意,您将 backgroundView
和 scrollView
设置为 nil
的尝试删除了对它们的强引用,但之前调用了 addSubview
,因此视图层次结构仍然具有对他们的强烈参考。如果你想摆脱一切,在将 scrollView
设置为 nil
之前,确保调用 scrollView.removeFromSuperview()
以将其从视图层次结构中删除。