TLDR: iOS8.1 用の XCode 6.1 ビルドで swift を使用すると、EXC_BAD_ACCESS エラーが発生します。問題はおそらくコンパイラ エラーであると思います。
私は、ユーザーが (英語の意味で) 辞書から (韓国語の) 単語を単語リストに追加できるアプリを作成しています。単語を定義する次のクラスがあります (関連する定義、オーディオ ファイル、ユーザー インタラクション統計などを含む) および単語リスト (関連する単語のリストと、リストに単語を追加/削除するメソッド、リストをアルファベット順に並べるメソッドを含む)など):
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番目の単語で)次のprintln情報を含む(WordList)addWordToListでEXC_BAD_ACCESSエラーを取得します。
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 単語の 1 つである場合、「大学生」という単語を正常に追加できます)。単語リスト内の単語数に基づいて動作を明示的に変更するコードのどこにもありません (単語リスト内の単語を UITableView のセルとして表示することを除く)、または (私の知る限り) 8番目の単語は特別な番号です。実際、この数値はlet hack=ソリューション (以下を参照) を使用して別の数値に変更できますが、特定のビルドでは常に同じ数値になります。
この時点で、私は何をすべきか完全に途方に暮れています。私はswiftに比較的慣れておらず、exc_bad_accessエラーを修正する方法を調べるのにかなりの時間を費やしました。私は次のポイントに来ました:
exc_bad_access エラーは通常、次の 3 つのいずれかを意味するようです ( http://www.touch-code-magazine.com/how-to-debug-exc_bad_access/ )
- オブジェクトが初期化されていません
- オブジェクトはすでに解放されています
- あまり起こりそうにないその他のこと
アクセスエラーが発生する直前に、問題の辞書の内容 ( knownWords )を出力できるため、1 または 2 のいずれにも当てはまらないと思います。ただし、いつものように、明らかな何かが欠けている可能性が高いので、これが本当かどうか教えてください。
エラーの原因が上記の 3 (「その他」) の場合、次のことを試しました。
( NSExpression ソリューションの評価に使用した後に Swift 辞書を更新する場合は、辞書を使用した iOS 8.1 のEXC_BAD_ACCESSおよびEXC_BAD_ACCESS から)
- 私はさまざまなバリエーションのlet sickHack =シナリオを試しましたが、結果が変わることもありますが、クラッシュする前に許可されたエントリの数だけです (つまり、エラーの前に辞書の ~15/16 エントリに到達することがあります)。ただし、この方法を使用して実際にバグのない解決策を見つけることはできませんでした。
- リリース モードとデバッグ モードの両方を使用して再構築しました。エラーは両方に表示されます。注: 私はシミュレーターのみを使用しており、実際のデバイスで試すための開発者のライセンスは持っていません。
- コンパイラの最適化をオフ (「なし」に設定) にしました (デバッグ ビルドでは既にオフになっていました)。
- 同じエラー結果で iOS 8.0 にビルドしようとしました。
この問題を回避する任意の方法を歓迎します。let hack =ソリューションは受け入れられますが、できれば、異なるビルド条件で将来エラーが発生しないことを少なくとも保証するソリューションが望ましいです。
ありがとう!