開発環境
> xcodebuild -version
Xcode 12.0.1
Build version 12A7300
コード
import UIKit
struct Hoge {
static var p1: Int {
get {
return p2 // Thread 1: EXC_BAD_ACCESS (code=2, address=0x...)
}
}
static var p2: Int {
get {
return p1
}
}
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
print(Hoge.p1)
// 以降は実行されない
}
}
上記のようなコードはビルドはできるが実行時にエラーとなる。
相互参照回数は52314回程度だった。
import UIKit
struct Hoge {
static var p1: Int {
get {
count += 1
execFatalError(condition: count >= 5)
return p2
}
}
static var p2: Int {
get {
count += 1
execFatalError(condition: count >= 5)
return p1
}
}
static var count = 0
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
print(Hoge.p1)
}
}
func execFatalError(condition: Bool) {
guard condition else {
return
}
fatalError()
}
getter内に相互参照した回数で分岐させる処理を書けば良さそう。