一尘不染

快速覆盖二传手

swift

我的二传手迅速遇到了一个奇怪的问题。我有带有代码的PlayingCard类:

var rank: NSInteger {
    get{
        return self.rank
    }
    set(rank){
        self.rank = rank
    }
}

var suit: NSString {
    get{
        return self.suit
    }
    set(suit){
        self.suit = suit
    }
}

init(suit: NSString, rank: NSInteger) {
    super.init()
    self.suit = suit
    self.rank = rank
}

我在另一个类中使用此init()方法,实现如下所示:

init() {
    super.init(cards: [])
    for suit in PlayingCrad.validSuit() {
        var rank: Int = 0
        for rank; rank <= PlayingCrad.maxRank(); rank++ {
            var card = PlayingCrad(suit: suit, rank: rank)
            addCard(card)
        }
    }
}

当代码看起来像上面的代码时,我在一行中遇到了一个错误:

self.suit = suit

EXC_BAD_ACCESS(code=2, adress=0x7fff5c4fbff8)

但是,当我从 等级西服 属性中删除setter和getter时,它工作正常,没有出现错误。

您能解释一下为什么出现此 EXC_BAD_ACCESS 错误吗?

谢谢您的帮助


阅读 201

收藏
2020-07-07

共1个答案

一尘不染

通过写这个…

set(suit) {
    self.suit = suit
}

…引入无限循环,因为您是从设置器内部调用设置器的。

如果不计算您的属性,则应利用willSetdidSet通知者在属性更改之前/之后执行任何其他工作。

顺便说一句,您也应该删除te getter。访问该属性时,它将导致另一个无限循环。

2020-07-07