Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios “错误”;EXC坏访问”;在Swift中使用子类_Ios_Swift_Xcode - Fatal编程技术网

Ios “错误”;EXC坏访问”;在Swift中使用子类

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

我制作了3个文件
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。。。。