ios html gif 显示,显示gif时出现巨大的内存使用Swift iOS

我正在制作一个应用程序,它在UIImageView中显示gif,并从parse中加载gif。我偶然发现的问题是每当我加载一个Gif时,它会使用大约20 MB的内存,并且当我执行一个segue时,这个内存不会被分配。我从UIImageView中删除图像本身,但它仍然不释放内存。显示gif时出现巨大的内存使用Swift iOS

这是我用来显示GIF代码:

extension UIImage {

public class func gifWithData(data: NSData) -> UIImage? {

guard let source = CGImageSourceCreateWithData(data, nil) else {

print("SwiftGif: Source for the image does not exist")

return nil

}

return UIImage.animatedImageWithSource(source)

}

public class func gifWithName(name: String) -> UIImage? {

guard let bundleURL = NSBundle.mainBundle().URLForResource(name, withExtension: "gif") else {

print("SwiftGif: This image named \"\(name)\" does not exist")

return nil

}

guard let imageData = NSData(contentsOfURL: bundleURL) else {

print("SwiftGif: Cannot turn image named \"\(name)\" into NSData")

return nil

}

return gifWithData(imageData)

}

class func delayForImageAtIndex(index: Int, source: CGImageSource!) -> Double {

var delay = 0.1

// Get dictionaries

let cfProperties = CGImageSourceCopyPropertiesAtIndex(source, index, nil)

let gifProperties: CFDictionaryRef = unsafeBitCast(

CFDictionaryGetValue(cfProperties,

unsafeAddressOf(kCGImagePropertyGIFDictionary)),

CFDictionary.self)

// Get delay time

var delayObject: AnyObject = unsafeBitCast(

CFDictionaryGetValue(gifProperties,

unsafeAddressOf(kCGImagePropertyGIFUnclampedDelayTime)),

AnyObject.self)

if delayObject.doubleValue == 0 {

delayObject = unsafeBitCast(CFDictionaryGetValue(gifProperties,

unsafeAddressOf(kCGImagePropertyGIFDelayTime)), AnyObject.self)

}

delay = delayObject as! Double

if delay < 0.1 {

delay = 0.1 // Make sure they're not too fast

}

return delay

}

class func gcdForPair(var a: Int?, var _ b: Int?) -> Int {

// Check if one of them is nil

if b == nil || a == nil {

if b != nil {

return b!

} else if a != nil {

return a!

} else {

return 0

}

}

// Swap for modulo

if a < b {

let c = a

a = b

b = c

}

// Get greatest common divisor

var rest: Int

while true {

rest = a! % b!

if rest == 0 {

return b! // Found it

} else {

a = b

b = rest

}

}

}

class func gcdForArray(array: Array) -> Int {

if array.isEmpty {

return 1

}

var gcd = array[0]

for val in array {

gcd = UIImage.gcdForPair(val, gcd)

}

return gcd

}

class func animatedImageWithSource(source: CGImageSource) -> UIImage? {

let count = CGImageSourceGetCount(source)

var images = [CGImageRef]()

var delays = [Int]()

// Fill arrays

for i in 0..

// Add image

if let image = CGImageSourceCreateImageAtIndex(source, i, nil) {

images.append(image)

}

// At it's delay in cs

let delaySeconds = UIImage.delayForImageAtIndex(Int(i),

source: source)

delays.append(Int(delaySeconds * 1000.0)) // Seconds to ms

}

// Calculate full duration

let duration: Int = {

var sum = 0

for val: Int in delays {

sum += val

}

return sum

}()

// Get frames

let gcd = gcdForArray(delays)

var frames = [UIImage]()

var frame: UIImage

var frameCount: Int

for i in 0..

frame = UIImage(CGImage: images[Int(i)])

frameCount = Int(delays[Int(i)]/gcd)

for _ in 0..

frames.append(frame)

}

}

// Heyhey

let animation = UIImage.animatedImageWithImages(frames,

duration: Double(duration)/1000.0)

return animation

}

class func FinalFrame(source: CGImageSource) -> UIImage? {

let count = CGImageSourceGetCount(source)

var images = [CGImageRef]()

var delays = [Int]()

var finalFrame = UIImage()

// Fill arrays

for i in 0..

// Add image

if let image = CGImageSourceCreateImageAtIndex(source, i, nil) {

images.append(image)

}

// At it's delay in cs

let delaySeconds = UIImage.delayForImageAtIndex(Int(i),

source: source)

delays.append(Int(delaySeconds * 1000.0)) // Seconds to ms

}

// Get frames

let gcd = gcdForArray(delays)

var frames = [UIImage]()

var frame: UIImage

var frameCount: Int

for i in 0..

frame = UIImage(CGImage: images[Int(i)])

frameCount = Int(delays[Int(i)]/gcd)

for _ in 0..

frames.append(frame)

}

}

finalFrame = frames[frames.count-1]

return finalFrame

}

}

难道这是原因,我得到的内存问题? 感谢任何帮助!

+0

两者GIF和APNG可以以低存储器请求数,像这样进行处理:http://stackoverflow.com/a/25478854/763355 –

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/559745.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

非一体式台式计算机,一体台式机推荐及介绍【详解】

随着科技的不断发展电脑已经走进了家家户户&#xff0c;几乎每一个家庭都有一台甚至是两台电脑&#xff0c;人们对于电脑的需求越来越高&#xff0c;对于电脑的要求也就越来越大。不仅仅是在性能方面外观设计也很重要。随着人们对于更轻更薄的追求&#xff0c;电脑渐渐的开始走…

窄带物联网应用于工业计算机,工业物联网嵌入式边缘计算机的制作方法

本实用新型涉及工业物联网领域&#xff0c;具体地说是一种工业物联网嵌入式边缘计算机。技术背景加速发展物联网已成国际社会的战略共识&#xff0c;多国纷纷都在加快研发物联网技术&#xff0c;物联网已经升级到了国家级战略目标。传统制造业企业由于工厂中设备型号不一致、新…

计算机网络模拟器 mac,网易mumu模拟器mac版使用常见问题解决办法_3DM手游

不少Mac设备的用户&#xff0c;在使用网易MuMu模拟器时&#xff0c;都会遇到些许问题。关于大家在使用网易MuMu模拟器Mac版时经常会出现的问题&#xff0c;下面小编也为大家带来了一个FAQ。网易MuMu常见问题解答&#xff1a;1、Mac版安装环境操作系统&#xff1a;mac os 10.11.…

如何让cloudflare缓存html,CloudFlareCDN页面规则缓存设置教程

wordpress博客使用CloudFlare的CDN来加速网站(页面规则缓存设置教程)此篇文章只讲wordpress站点使用CloudFlare CDN的页面规则教程。CloudFlare的CDN有一个很好的特点就是可以整站缓存下来&#xff0c;但是整站缓存时我们是无法登陆后台的&#xff0c;新写的文章也无法预览。所…

855计算机应用基础,2017年曲阜师范大学信息技术与传播学院855计算机应用基础考研导师圈点必考题汇编...

一、选择题1&#xff0e; 有以下程序&#xff1a;程序运行后的输出结果是( )。A.1256B.5634C.5612D.3456【答案】B【解析】第一次funl 传递参数5, 6&#xff0c;输出5, 6, 第二次调用fun2&#xff0c;fun2的作用是将全局变量a 变为3, b 变为4, 故输出3, 4。2&#xff0e; 有以下…

计算机课中排序选什么,《计算机应用基础课件》1.6 排序复习课程.ppt

《计算机应用基础课件》1.6 排序复习课程.ppt第 1 章  数据结构 ;插入排序的基本思想&#xff1a;;1.直接插入排序: 思路&#xff1a;认可第1个记录已排好序&#xff0c;然后将第2个到第n个记录依次插入到前面已排好序的记录组成的文件中。 具体过程(第i个记录Ri插入到前面i-1…

计算机图形设计论文 真实图形生成技术的发展,绘制技术论文,关于计算机图形图像绘制技术的现状应用相关参考文献资料-免费论文范文...

导读:这是一篇与绘制技术论文范文相关的免费优秀学术论文范文资料,为你的论文写作提供参考。(四川建筑职业技术学院,德阳618000)(Sichuan College of Architectural Technology,Deyang 618000,China)宗海图绘制技术规范:画 干画笔 绘制技术摘 要&#xff1a; 随着计算机图形图像…

检索有关计算机系统功能设计方面的文献,文献检索系统

文献检索系统是指按某种方式、方法建立起来的供读者查检信息的一种有层次的体系&#xff0c;是表征有序的信息特征的集合体。在这个集合体中&#xff0c;对所收录的信息的外部特征和内容特征都按需要有着详略不同的描述&#xff0c;每条描述记录(即款目)都标明有可供检索用的标…

hashset java 键值对_Java集合 - HashSet的定义以及用法

HashSet的定义HashSet类实现了Set接口&#xff0c;由一个实际上是HashMap实例的散列表​支持。不能保证该集合的迭代次序&#xff0c;这意味着该类不能保证元素随时间的不变顺序。这个类允许null元素。该类还为基本操作(如添加&#xff0c;删除&#xff0c;包含和大小)提供了恒…

计算机对口高考文化试卷,计算机对口高考模拟试卷

计算机对口高考模拟试卷 (9页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;9.9 积分2011-2012第一学年对口计算机期中试卷一、选择题(每题2分&#xff0c;共50分) 下列各组设备中&#xff0c;全部属…

delve 调试带参数_带你学够浪:Go语言基础系列-环境配置和 Hello world

前面几周陆陆续续写了一些后端技术的文章&#xff0c;包括数据库、微服务、内存管理等等&#xff0c;我比较倾向于成体系的学习&#xff0c;所以数据库和微服务还有后续系列文章补充。最近工作上比较多的 Golang 编程&#xff0c;现在很多互联网公司都在转向 Golang 开发&#…

语音 视频 质量测试软件,DxOMARK官方发布视频,了解如何测试手机音频质量

IT之家10月11日消息 北京时间昨日晚间&#xff0c;DxOMARK正式推出了手机音频评分系统DXOMARK Audio&#xff0c;官方也发布视频告诉大家DXOMARK如何测试手机音频质量。视频中展示了录制环节&#xff0c;包括自拍视频、语音消息、播放视频、游戏、播放音乐等。通过三个步骤测试…

计算机拆卸组装过程,如何拆卸并重新组装笔记本电脑

如何拆卸并重新组装笔记本电脑当您的笔记本电脑需要更换、升级硬件或者清理内部灰尘时&#xff0c;您需要知道如何进行拆卸并重装&#xff0c;跟着本文一起了解是如何进行的吧。详细了解如何安全处理旧组件或笔记本电脑。拆卸笔记本电脑本文只是通用性的拆卸指南&#xff0c;具…

flex 固定一列_css实现两列固定与一列自适应的几种方法

本文介绍了css实现两列固定与一列自适应的几种方法&#xff0c;分享给大家&#xff0c;具体如下&#xff1a;1.flex布局Flexible Box 模型&#xff0c;通常被称为 flexbox&#xff0c;是一种一维的布局模型。它给 flexbox 的子元素之间提供了强大的空间分布和对齐能力。我们说 …

登录服务器用户账户限制,当用户有登录到的限制时,远程桌面登录报错的解决...

------老朱 2015.3.6一客户对普通域用户能够登录到的计算机有着严格的限制&#xff0c;即在用户账户中进行了登录到的设置&#xff0c;比如张三只能登录到张三的电脑&#xff0c;但对服务器账户没有限制&#xff0c;现在准备限制服务器账户能够登录到的服务器&#xff0c;按原来…

js在wap端获取定位_iPhone 定位服务,没用的都关掉

iOS 13 系统带来了很多新功能&#xff0c;同时对用户的隐私保护也进行了再度加强和优化。比如和用户隐私息息相关的定位服务&#xff0c;苹果在「始终」和「永不」之外&#xff0c;又加入了「使用 App 期间」这个更人性化的选项&#xff0c;应用只有在使用期间才会获取你的位置…

css grid布局增加边框,CSS Grid中每行之后的边框

3 个答案:答案 0 :(得分&#xff1a;5)您可以使用justify-content在内容之前和之后添加其他列&#xff0c;而不是1fr将内容置于中心位置。然后将div之后的div和.line置于第二列的开头。* {box-sizing: border-box;}.outer {width: 80%;margin: 0 auto;}.wrapper {border: 2px s…

服务器系统日志6008,DELL服务器宕机事件6008

在DELL服务器上安装了windows server 2008 r2 64位标准版&#xff0c;客户在该操作系统上安装了自己开发的视频监控软件。服务器在运行一段时间后&#xff0c;会出现如下情况&#xff1a;(事件ID6008)1。机器硬件没有报错&#xff0c;但是无法Ping通&#xff0c;不能登录远程桌…

java 获取内存大小_JVM面试题扩展:Java代码在JVM中的执行流程

代码示例&#xff1a;public class Test { // 常量 public static final String MAN_SEX_TYPE "man"; // 静态变量 public static String WOMAN_SEX_TYPE "woman"; public static void main(String[] args) { People people …

centos mysql无法启动 sock_linux 下mysql无法启动 mysql.sock

在公司装的一键安装的lnmp环境&#xff0c;启动mysql时候发现mysql.sock不存在&#xff0c;然后我进行查找 最后在 /usr/local/mysql/bin/mysql_safe 重新启动下然后启动service mysql start查看 service mysql status网上各种说法&#xff0c;其实还是自己的安装目录找到&a…