我是一名长期的iOS开发人员,但刚刚开始使用swift。我正在研究一种能够裁剪图像的测试程序。我取得了很好的进步,但却出现了一些非常奇怪的事情。
我正在尝试播放用户裁剪和图像时的快门声(并将其保存到照片库。
我写了一个函数,为我的快门声音创建一个AVAudioPlayer。该功能得到了#39;由惰性存储属性调用,但该细节不重要。
该功能如下所示:
func loadShutterSoundPlayer() -> AVAudioPlayer?
{
let theMainBundle = NSBundle.mainBundle()
let filename = "Shutter sound"
let fileType = "mp3"
if let soundfilePath = theMainBundle.pathForResource(filename,
ofType: fileType)
{
let fileURL = NSURL.fileURLWithPath(soundfilePath)
return AVAudioPlayer.init(contentsOfURL: fileURL, error: nil)
}
else
{
return nil
}
}
当使用上面的可选绑定编写时,if let soundfilePath
位认为它成功,并在大括号内执行条件代码,但soundfilePath中的结果值是垃圾。有时它是随机字符,有时它是方法名称等。它类似于NSBundle方法上的内存策略pathForResource:ofType:正在释放对象并创建一个僵尸。
如果我将代码重写为不,请使用可选绑定,它会按预期工作:
func loadShutterSoundPlayer() -> AVAudioPlayer?
{
let theMainBundle = NSBundle.mainBundle()
let filename = "Shutter sound"
let fileType = "mp3"
let soundfilePath: String? = theMainBundle.pathForResource(filename,
ofType: fileType)
if soundfilePath != nil
{
let fileURL = NSURL.fileURLWithPath(soundfilePath!)
return AVAudioPlayer.init(contentsOfURL: fileURL, error: nil)
}
else
{
return nil
}
}
我在这里遗漏了什么吗?这有点像编译器错误或NSBundle方法pathForResource:ofType定义中的错误:生成错误的ARC代码。