Ios “错误”;EXC坏访问”;在Swift中使用子类
我制作了3个文件Ios “错误”;EXC坏访问”;在Swift中使用子类,ios,swift,xcode,Ios,Swift,Xcode,我制作了3个文件GameViewController,GameView,GameItemView,但是如果GameItemView继承了GameView 出现EXC错误访问错误 就像下面的代码 class GameViewController: UIViewController { var gameView: GameView! override func viewDidLoad() { super.viewDidLoad() gameVie
GameViewController
,GameView
,GameItemView
,但是如果GameItemView
继承了GameView
出现EXC错误访问错误
就像下面的代码
class GameViewController: UIViewController {
var gameView: GameView!
override func viewDidLoad() {
super.viewDidLoad()
gameView = GameView.init(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: 568))
self.view.addSubview(gameView)
gameView.gameViewController = self
}
//....
}
class GameView: UIView {
weak var gameViewController: GameViewController! //when GameViewController will appear, BAD ACCESS error appear and stop here
weak var gameItemView: GameItemView!
override init(frame: CGRect) {
super.init(frame: frame)
gameItemView = GameItemView.init(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: 568))
self.addSubview(gameItemView)
}
//....
}
class GameItemView: GameView {
override init(frame: CGRect) {
super.init(frame: frame)
//add some views
}
//...
}
我以前在GameView
上写过一些GameItemView
的代码。但是GameView的
代码太长了,所以我把其中的一部分移到了GameItemView
。但随后错误出现了。我怎样才能解决它
更新:
我将在出错的地方添加代码。对不起,我忘记写了
var gameGameViewController: GameViewController!
为什么要从
GameView
继承gameviewItem
?如果您想这样做,那么为什么要像上面那样编码,从而导致对GameViewItem
&GameView
的init
进行递归调用。请将GamveViewItem
的父类更改为UIView
或其他类型,或者中断由init
引起的递归模式
GameView
的初始化
override init(frame: CGRect) {
super.init(frame: frame)
// Here you're calling GameItemView's init, now go to GameItemView's init
gameItemView = GameItemView.init(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: 568))
self.addSubview(gameItemView)
}
override init(frame: CGRect) {
// You're calling GameView's init here and it goes back to
// there and then this keep on happening
super.init(frame: frame)
//add some views
}
GameItemView
的初始化
override init(frame: CGRect) {
super.init(frame: frame)
// Here you're calling GameItemView's init, now go to GameItemView's init
gameItemView = GameItemView.init(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: 568))
self.addSubview(gameItemView)
}
override init(frame: CGRect) {
// You're calling GameView's init here and it goes back to
// there and then this keep on happening
super.init(frame: frame)
//add some views
}
试试这个:
class GameViewController: UIViewController {
var gameView: GameView!
override func viewDidLoad() {
super.viewDidLoad()
gameView = GameView.init(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: 568))
self.view.addSubview(gameView)
gameView.gameViewController = self
}
//....
}
class GameView: UIView {
var gameViewController = GameViewController()
var gameItemView = GameItemView()
override init(frame: CGRect) {
super.init(frame:frame)
gameItemView = GameItemView.init(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: 568))
self.addSubview(gameItemView)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
class GameItemView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
//add some views
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
添加一个异常断点并运行代码。它会指向导致撞车的线路。然后您可以从
GameView
中研究如何解决itremove变量gameItemView
。或者,如果需要,则不要将GameView
继承到GameItemView
中,因为该错误是在哪一行发生的?视图不应该知道它在哪个viewcontroller中in@gowtham我更新了代码。请检查一下,非常感谢。我使用了您的代码,但如果GameView和GameItemView像“GameView.something()”和“GameItemView.something=true”那样互相调用,则不会调用Denit。我尝试使用“弱变量gameItemView=gameItemView()”,如果视图将消失gameView.gameItemView=nil,则不调用Denit。。。。