K.K.D
K.K.D

Reputation: 937

Error "EXC BAD ACCESS"with subclass in Swift

I made 3 files GameViewController, GameView, GameItemView but if GameItemView inherits GameView than

EXC BAD ACCESS error appeared

like below code.

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
    }
//...

}     

I wrote some code of GameItemView on GameView before. But GameView's code became so long, so I moved a part of them to GameItemView. But then the error appeared. How can I solve it?

UPDATE:

I'll add the code where I got the error. I'm sorry I forgot to write it.

var gameGameViewController: GameViewController!

Upvotes: 1

Views: 363

Answers (2)

Arvind
Arvind

Reputation: 1

try this:

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")
  }

}

Upvotes: 0

Inder Kumar Rathore
Inder Kumar Rathore

Reputation: 40018

Why are you inheriting GamveViewItem from GameView? If you wanted to do so then why are coding like above which causes recursive calls to the init of GamveViewItem & GameView. Please either change the parent class of the GamveViewItem to UIView or some other or break the recursive pattern caused by the init.

GameView's init

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)
}

GameItemView's init

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
}

Upvotes: 2

Related Questions