Swift NSBundle.pathForResource的可选绑定是返回垃圾吗?

时间:2015-03-25 16:32:18

标签: ios swift nsbundle

我是一名长期的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代码。

0 个答案:

没有答案