iOS 音视频编辑器App Crash从4.7%到0.3%

1,defer的理解不到位,这个崩溃0.7%,总共300个崩溃,它一个崩溃就占了70多个。

var imageData: UnsafeMutableRawPointer!

if needRedraw {

    imageData = UnsafeMutableRawPointer.allocate(byteCount: length, alignment: 4)

    guard let context = imageContext else {

        throw AnyError("failed to init CGContext")

    }

    defer {
        imageData.deallocate()
    }

}

return imageData

大家来看看上述代码有什么问题?

问题1:defer写在了throw后边,当项目有Error throw时,这里就产生了内存泄露,因为throw后边的代码根本不会执行。

解决1:那怎么解决呢?首选大家想到defer最好紧跟在UnsafeMutableRawPointer.allocate下面写就好了嘛,对不对?那上述代码就变成了:

var imageData: UnsafeMutableRawPointer!

if needRedraw {

    imageData = UnsafeMutableRawPointer.allocate(byteCount: length, alignment: 4)

    defer {
        imageData.deallocate()
    }

    guard let context = imageContext else {

        throw AnyError("failed to init CGContext")

    }

}

return imageData

大家再看上述代码有什么问题呢?

这里考验大家对defer的理解了,那我问一下,这里的defer在哪行代码执行完后释放呢?大家可能会说return后执行,这是错的,实际defer在if的作用域走完后就释放了,导致return的imageData变成了空的,直接崩溃了。

最后大家再来看看firebase这个堆栈:


image.png

swift_slowAlloc你能看明白这是个什么鬼吗?没解决过这种崩溃的绝对一头雾水,心里一万个草泥马汹涌而过,这咋解,然而细节决定成本,答案就隐藏在细节中,不停的细扣,写demo测试,网上搜索,你才能把这个堆栈跟上述问题及解决方案联系到一块去,最终把这个问题解决掉。

2,RTRootNavigationController引起的崩溃:

image.png

引入这个三方库呢是为了解决系统导航条显示隐藏push、pop、侧滑的动画不平滑问题,加了这个库之后外层会有一个大的RootNavigationController,然后每一个viewController会有一个自己的ContainerNavigationController,这样显示隐藏只要设置内部的导航条即可,动画无比的流畅。

但是现在这个库有27个崩溃,崩溃率在当时占0.27%,但看这个堆栈死活看不出问题来,最后带着尝试的态度把containerNavigationController的tabBarController方法给注掉了,因为看了一下里边代码,没有系统会自动处理这个方法,注掉后这个问题没有了。

3,AVMutableAudioMixInputParameters传入的timeRange invalid的问题

parameters.setVolumeRamp(fromStartVolume: volume, toEndVolume: volume, timeRange: data.timeRange)

我同事写的音视频编辑器传入的这个data.timeRange传入的值存在invalid的问题,将这行代码修改为:

var timeRange = CMTIMERANGE_IS_VALID(data.timeRange) ? data.timeRange : .zero

parameters.setVolumeRamp(fromStartVolume: volume, toEndVolume: volume, timeRange: timeRange)

4,优化智能生成图片的压缩,在55张素材的情况下iphone8从高峰1.2G内存崩溃一直降到高峰600M

实际使用发现在智能生成里图片没有进行压缩,直接使用的相册选择的超高清分辨率的素材,增加了根据设备型号进行分级返回压缩尺寸,然后进行压缩,从而降低内存使用,降低OOM引起的崩溃。

5,优化智能生成根据素材数量进行的压缩操作,在iPad下素材数量很多时优化前占用1.9G内存,优化后占用778M

实际使用发现智能生成中没有根据素材数量来实现不同等级的尺寸压缩,新增代码实现素材数量越多压缩比率越大,尺寸越小,使这种情况下内存占用大幅降低。降低OOM崩溃

6,导出时即时释放导出完成的素材、特效、转场、滤镜资源,iPad下从导出最高2.75G优化到800M

智能生成导出时之前不会进行导出完毕素材等资源的释放,导致资源在导出过程中一直占用,当素材很多的时候,内存占用非常庞大,即时释放后内存大幅降低。降低了OOM崩溃。

7,解决强解包引起的崩溃,例如以下写法:

(1)全局变量 public var text: AnimatedText!,全靠自己在指定位置初始化,万一哪里没走初始化代码直接访问了,就强解包崩溃了。所以这种代码就不要写,写?,用的地方也加?或者guard 一下。

(2)return一个强解包

private static var _document: URL?

    public static var document: URL {

        if _document == nil {

            let manager = FileManager.default

            if let url = try? manager.url(

                for: .documentDirectory,

                in: .userDomainMask,

                appropriateFor: nil,

                create: false

            ) {

                _document = url

            }

        }

        return _document!

    }

将最后一行修改为

return _document ?? temporary

8,lowerBound > upperBound,例如

var a = 10 

var b = 8

for _ in a...b {}

在for前面加一个guard a > b else { return }

9,static URL._unconditionallyBridgeFromObjectiveC

FBSDKShareKit的videoURL方法没有写nullable,但实际返回了nil,swift桥接时崩溃了。

- (nullable NSURL *)fbVideoURL {
    return [self videoURL];
} 

加了一个OC包装方法声明为nullable,在swift中guard一下

guard let videoURL = asset.fbVideoURL else {
    completion?(ShareError.resourceConvertDataFailed)
    return
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 197,966评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,170评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 144,909评论 0 327
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,959评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,851评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,583评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,956评论 3 388
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,590评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,878评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,892评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,719评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,501评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,957评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,124评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,440评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,003评论 2 343
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,211评论 2 339

推荐阅读更多精彩内容