私は、XcodeやLLDBのドキュメントを読んでもわからないようなことに遭遇しました。アプリケーションがブレークポイントを持つ行に到達すると、ブレークポイントが存在する場合は、LLDBがその行でブレークするはずです。突然変異関数を実行している間にその行のコードにアクセスしても、ブレークポイントはトリガーされません。Xcodeでブレークポイントをトリガするメンバーを変更していないのはなぜですか?
は、次の例を考えてみましょう:
class DataSource {
private init(){
data = []
for i in 0..<10 {
data.append(i) // mutating func
}
}
static let sharedInstance = DataSource()
var data: [Int]! // Set a breakpoint on this line
}
class Worker {
func work(){
print("Append item")
DataSource.sharedInstance.data.append(23) // mutating func
print("Get first item")
print(DataSource.sharedInstance.data[0]) // subscript - TRIGGERS BREAKPOINT
print("Drop first")
print(DataSource.sharedInstance.data.dropFirst()) // func - TRIGGERS BREAKPOINT
print("Remove first")
print(DataSource.sharedInstance.data.removeFirst()) // mutating func
print("Remove at 0")
print(DataSource.sharedInstance.data.remove(at: 0)) // mutating func
}
}
.data[0]
と.dropFirst()
は、ブレークポイントをトリガされ、他の関数呼び出しではありません。私が見ることができる唯一の違いは、破損していないそれらの機能がmutating
の機能であるということです。
ブレークポイントはトリガされませんが、同じ行に追加されたウォッチポイントが毎回トリガされます。
誰かがこの現象を説明できますか? MacOSで