2

TLDR:我在为 iOS8.1 构建的 XCode 6.1 中使用 swift 时遇到 EXC_BAD_ACCESS 错误。我相信这个问题很可能是编译器错误。

我正在制作一个应用程序,其中允许用户将字典(在英语意义上)中的(韩语)单词添加到单词列表中。我有以下类定义一个单词(带有相关的定义、音频文件、用户交互统计等)和一个单词列表(带有相关的单词列表和在列表中添加/删除单词的方法,按字母顺序排列列表, ETC):

class Word: NSObject, NSCoding, Printable {
    var hangul = String("")
    var definition = String("")
    // ...
}

class WordList: NSObject, NSCoding {
    var title = ""
    var knownWords = Dictionary<String,String> ()
    // ...

    func addWordToList(wordName: String, wordDefinition: String) {
        // Debug statements
        println("I am WordList \"\(self.title)\" and have the following knownWords (\(self.knownWords.count) words total): ")
        for (_wordName,_wordDefinition) in self.knownWords {
            println("\t\"\(_wordName)\" : \(_wordDefinition)")
        }
        println("\nI am about to attempt to add the word \"\(wordName)\" with definition \"\(wordDefinition)\" to the above dictionary")

        // Add word to wordList, including the 'let' fix 
        fix_EXC_BAD_ACCESS_bug()
        knownWords[wordName] = wordDefinition // EXC_BAD_ACCESS
    }
    func fix_EXC_BAD_ACCESS_bug() {
        // This empty line attempts to solve a exc_bad_access compiler bug when adding a new value to a WordList dictionary
        let newDic = self.knownWords
    }
    // ...
}

接下来,我有一个带有 UISearchBar 的 UITableViewController,我用它来向用户显示单词的字典(同样是英语意义上的)。用户通过点击每个单元格右侧的按钮(显示图像)来添加单词,该按钮调用 viewController 中的@IBAction func addWord()

class AddingWordsToWordList_TableViewController: UITableViewController, UISearchResultsUpdating {
    var koreanDictionary = KoreanDictionary() // Custom class with method 'getWord(index: Int)' to return desired Word
    var filteredSearch = [Word]()        
    // ...

    // Add word
    @IBAction func addWord(sender: UIButton) {
        // Add word
        if self.resultSearchController.active {
            let word = filteredSearch[sender.tag]
            wordList.addWordToList(word.hangul, definition: word.definition) // Enter addWordToList() here

        } else {
            let word = koreanDictionary.getWord(sender.tag)
            wordList.addWordToList(word.hangul, definition: word.definition)
        }

        // Set image to gray
        sender.imageView?.image = UIImage(named: "add133 gray")

        // Save results
        wordList.save()

        // Reload table data
        tableView.reloadData()
    }
    // ...

起初,该应用程序编译并且似乎运行良好。我可以添加一个新单词列表并开始向其中添加单词,直到添加第 8 个单词。我(总是在第 8 个单词上)在 (WordList) addWordToList中收到 EXC_BAD_ACCESS 错误,并带有以下 println 信息:

I am WordList "School" and have the following knownWords (7 words total): 
"방학" : school vacation
"대학원" : graduate school
"학년" : school year
"고등학생" : high school student
"초등학교" : elementary school
"학생" : student
"학교" : school

I am about to attempt to add the word "대학생" with definition "college student" to the above dictionary

请注意,我添加单词的顺序似乎无关紧要(即“大学生”一词如果是前7个单词之一,则可以成功添加)。代码中没有任何地方我根据单词列表中的单词数显式更改行为(除了将单词列表中的单词显示为 UITableView 中的单元格),或任何会(据我所知)使第 8 个字是一个特殊的数字。事实上,这个数字可以通过使用let hack=解决方案(见下文)更改为不同的数字,但对于特定的构建总是相同的数字。

在这一点上,我完全不知道该做什么。我对 swift 比较陌生,并且花了好几个小时来查找如何修复 exc_bad_access 错误。我已经到了以下几点:

似乎 exc_bad_access 错误通常意味着三件事之一(http://www.touch-code-magazine.com/how-to-debug-exc_bad_access/

  1. 对象未初始化
  2. 一个对象已经被释放
  3. 其他不太可能发生的事情

我觉得 1 或 2 都不适合我,因为在我们得到访问错误之前,我们可以打印出相关字典的内容(knownWords)。但是,与往常一样,我很可能遗漏了一些明显的东西,所以如果这确实是真的,请告诉我。

如果错误是由上述 3 引起的(“其他”),我尝试了以下方法:

(从带有字典的 iOS 8.1 上的EXC_BAD_ACCESS和使用它评估 NSExpression解决方案更新 Swift 字典时的 EXC_BAD_ACCESS 开始)

  1. 我已经尝试过letdutyHack =场景的不同变体,它有时确实会改变结果,但只会改变崩溃前允许的条目数(即,有时我可以在出现错误之前到达字典中的第 15/16 个条目)。但是,我无法使用这种方法找到实际的、无错误的解决方案。
  2. 我已经使用 Release 和 Debug 模式进行了重建;错误出现在两者中。注意我只使用模拟器,没有开发者许可在实际设备上试用。
  3. 我已经关闭(设置为“无”)编译器优化(无论如何它已经关闭了调试版本)。
  4. 我已经尝试构建到 iOS 8.0 并得到相同的错误结果。

任何解决此问题的方法都值得赞赏。let hack =解决方案是可以接受的,但最好的解决方案至少可以保证将来在不同的构建条件下不会产生错误。

谢谢!

4

0 回答 0