【问题标题】:EXC_BAD_ACCESS and MPMusicPlayerControllerEXC_BAD_ACCESS 和 MPMusicPlayerController
【发布时间】:2018-11-08 01:06:56
【问题描述】:

我编写了一个有一段时间没有开发的应用程序。它从 Xcode 7.3.1 开始,但在 Xcode 8.3.3 中运行良好。当我尝试在带有 iOS 11.4.1 的 iPhone 8 上运行它时,我得到了 EXC_BAD_ACCESS(我希望我从未更新过 iOS,但现在我被卡住了)。但该应用程序在我的装有 iOS 10.3.3 的旧 iPhone 5 上仍然可以正常运行。

我的 Mac 运行 Sierra 并具有 Xcode 8.3.3 和 9.2。我确实将适当的支持文件复制到每个 Xcode 应用程序的正确文件夹中(我在这个网站上学到的东西)。这个技巧已经奏效了一段时间!

我决定在 Xcode 9.2 下构建一个小的“Hello World”应用程序只是为了简化事情。如果我删除下面的 MPMusicPlayerController(),应用程序安装并运行良好。但是,使用该代码,它会在 self.myMPMusicPlayerController.playbackState == .stopped 上崩溃。

任何人都可以提出任何建议吗?非常感谢您。

import UIKit
import MediaPlayer

class ViewController: UIViewController {

@IBOutlet var myLabel: UILabel!
@IBOutlet var nowPlaying: UIButton!

var myMPMusicPlayerController = MPMusicPlayerController()

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    // The following is a tiny bit of an app
    // My mac is running Sierra so it can only take Xcode 8.3.3 or 9.2
    // I will be updating my mac at least to High Sierra soon, so it will be able to take Xcode 9.4.1
    // I have copied in the appropriate support file folders accordingly. So I have the 11.4 (15F79) folder in place

    // The following line, worked fine using Xcode 8.3.3 and an iPhone8 running 11.2 and an iPhone5 running 10.3.3
    // The following line, crashes on an iPhone8 running 11.4.1 but RUNS FINE on the iPhone5 running 10.3.3

    // I'm getting the error: Thread 1: EXC_BAD_ACCESS (code=1, address=0x70)
    if self.myMPMusicPlayerController.playbackState == .stopped {

        // Hide the nowPlaying button.
        nowPlaying.isHidden = true
    } else {

        // Show the nowPlaying button.
        nowPlaying.isHidden = false
    }

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

// I added this just for a simple test
@IBAction func nowPlayingButton(_ sender: Any) {
    self.myLabel.text = "Hello"
}

}

【问题讨论】:

  • 您是否尝试过启用 Zombies 来确定您的应用程序仍在访问哪个已释放的对象?能否提供 EXC_BAD_ACCESS 错误的日志?
  • 我没试过僵尸。我会试试的!另外,我会追踪日志。问题是,上面的代码是整个应用程序。我从 iPhone8 中删除了该应用程序,然后 Xcode 安装了这个小应用程序。没有运气,崩溃。到目前为止,唯一的“共同点”是安装 iOS 11.4.1。
  • 我启用了 Zomies 打开了 Logging -> Malloc Stack。转储到控制台的是: Hello(1654,0x1b6fdbb40) malloc: stack logs beingwritten into /private/var/mobile/Containers/Data/Application/1F37A5D0-2F42-4B0E-802C-BB5B57CFA84C/tmp/stack-logs .1654.103364000.Hello.33AvRC.index Hello(1654,0x1b6fdbb40) malloc:使用标准记录器 (lldb) 将 malloc 和 VM 分配堆栈记录到磁盘
  • 也许 11.4 (15F79) 无法与 iOS 11.4.1 配合使用。我在任何地方都找不到 11.4.1 (15G77)。我可能只需要安装 High Sierra,然后安装 Xcode 9.4.1(我假设这会给我 11.4.1 (15G77) 支持文件夹)。除此之外,这太疯狂了。

标签: ios swift xcode exc-bad-access mpmusicplayercontroller


【解决方案1】:

我尝试运行您的代码,不幸的是我在 Xcode 10.1 上,但在 MPMusicPlayerController 的初始化中出现编译错误并显示以下错误:

Apple's Documentation of the MPMusicPlayerController 类中,您可以尝试使用
MPMusicPlayerController.systemMusicPlayerMPMusicPlayerController.applicationMusicPlayer 进行初始化,具体取决于您的用例。我已经尝试过这个并在 11.4.1 上运行并且没有遇到任何崩溃。

【讨论】:

  • 成功了!感谢您的帮助(抱歉耽搁了)。我确实找到了支持文件:11.4.1 (15G77)。我将文件夹放在 Xcode 8.3.3 中的正确位置,但它不起作用。我没有将文件夹重命名为 11.4.1。不确定这是否重要。无论如何,我的旧代码工作了很长时间。使用 MPMusicPlayerController.systemMusicPlayer 在迷你应用程序(上图)和大型多视图控制器应用程序中解决了这个问题。非常感谢你帮助我。我还有更多要学!
猜你喜欢
  • 2011-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多