近期iOS开发心得

AVAudioEngine + AVAudioPlayerNode时间不准问题

使用AVAudioEngine + AVAudioPlayerNode开发metronome过程中,偶然一次突然发现节拍不准了,经过与之前的代码对比,发现是AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback)导致的。参数应该设为playAndRecord。

AVAudioPlayerNode stop()导致界面卡死问题

测试过程中,反复开始、暂停会导致界面卡死。原来以为是start导致的,经过逐行打log,发现是stop导致的。对AVAudioPlayerNode的其他操作的代码逐行打log发现,每次卡死的原因是stop之后又对AVAudioPlayerNode操作导致。解决办法是每次调用前,看flag是否是已经stop。

objc_sync_enter objc_sync_exit导致死锁问题

代码中需要对一个数组加锁,当操作数组时候加锁,操作完毕时候解锁。在网上搜寻一圈发现使用objc_sync_enter和objc_sync_exit可实现。遂objc_sync_enter(arr)这样使用,结果发现时长发生死锁。逐行打log发现,可能是arr操作后就改变导致锁无法释放。遂改为objc_sync_enter(self)。

关于在defer里解锁的思考:

考虑到代码执行过程中可能会发生异常,导致未执行解锁代码,如果在java中可以使用try catch finally在finally中解锁。搜索发现swift有defer关键字,在方法执行结束前执行defer中的代码。遂在加锁后面加了defer,defer中解锁。但是马上考虑到不应这样操作,因为需要解锁的地方不是在方法结束时,如果在方法结束时强制解锁,会造成错误解锁。遂暂未使用defer。希望解锁前不会发生崩溃叭。

发表评论

电子邮件地址不会被公开。 必填项已用*标注