【问题标题】:Bad access error when trying to set or get an instance variable尝试设置或获取实例变量时出现错误的访问错误
【发布时间】:2015-11-29 10:59:58
【问题描述】:

我正在尝试制作一个场景,您可以将标签拖入正确的框中。但是,每当我尝试访问我的任何框的 labelInside 变量以设置或检索它时,我都会收到“线程 1:EXC_BAD_ACCESS (code=2,dress = 0x107867618)”错误。我试过检查僵尸的释放,但一无所获。我还尝试删除 getter 和 setter,只需将其设置为其中一个标签,但即便如此,它也会在检索时崩溃。根据我的研究,我认为它可能是一个损坏的指针,或者该类没有正确初始化,但我完全不知道如何修复它。我的“LabelBox”类代码及其崩溃的函数如下。任何帮助将不胜感激!谢谢。

    class LabelBox:UIView {
        let correctLabel:UILabel? = nil
        var labelInside:UILabel? {
            get {
                return self.labelInside ?? nil
            }
            set(newLabel) {

                newLabel?.center = self.center
            }
        }
        var containsCorrectLabel:Bool {
            get {
                return correctLabel == labelInside
            }
        }
     }        



    override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
        let touch:UITouch! = touches.first as UITouch!
        location = touch.locationInView(self.view)
        print(box1.correctLabel) //this works
        //print(box1.labelInside) //crashes when trying to get, even if value set to a label
        if let label = labelTouching {
             if let box = checkPointInBox(location) {
                box.labelInside = label //crashes when trying to set
            }
        }
        labelTouching = nil
    }

    func checkPointInBox(location: CGPoint) -> LabelBox? {
         let boxes = [box1, box2, box3]
         for box in boxes {
             if CGRectContainsPoint(box.frame, location){
                 return box
             }
         }
         return nil
     }

【问题讨论】:

  • correctLabel 与 "let" 为 nil,表示它是不可变的,表示它始终为 nil
  • 谢谢,没发现。现在我已经更改了它,我在尝试访问正确标签时也遇到了类似的 BAD_ACCESS 错误

标签: ios xcode swift swift2 xcode7


【解决方案1】:

看看你是如何定义labelInsidesetter

var labelInside:UILabel? {
    get {
        return self.labelInside ?? nil
    }
    set(newLabel) {
        labelInside?.center.x += 20
        self.labelInside = newLabel // this cause an infinite loop!
        self.labelInside!.center = self.center
    }
}

这意味着,稍后,当您编写 box.labelInside = label 时,setter 将被执行

但是在你的 setter 里面

self.labelInside = newLabel

这会产生另一个对 setter 的调用,再次执行

self.labelInside = newLabel

这确实会产生另一个对 setter 的调用...这个循环永远不会结束。

只需从您的设置器中删除此行。

self.labelInside = newLabel

修复 #2

您的代码中还有另一个错误,现在它不会导致崩溃,但将来可能会。

这一行

self.labelInside!.center = self.center

应该如下改变

self.labelInside?.center = self.center

修复 #3

好的,请尝试如下更新您的设置器

set(newLabel) {
    newLabel?.center.x += 20 // this line is useless and can be removed
    newLabel?.center = self.center
}

修复 #4

请删除当前的labelInside 属性(包括getter 和setter)并用这个替换。

var labelInside:UILabel? {
    didSet(newLabel) {
        newLabel?.center = self.center
    }
}

【讨论】:

  • 感谢您的回复!我了解无限循环并已将其删除,但是我仍然遇到相同的错误。我还将正确标签更改为变量,我错误地将其设置为常量,但是我现在在访问它时也遇到了 BAD_ACCESS 错误
  • 和上面一样,我只是删除了导致无限循环的行。我想我完全误解了 setter 是如何使用 newValue 的,所以我必须改变它才能让它按预期工作。然而,目前似乎每当我尝试访问类的实例变量时,我都会遇到错误的访问错误,如果我将变量更改为常量,我不会得到这个错误
  • 请更新相关代码以与您现在使用的代码完全匹配。下一个:访问是什么意思?阅读还是写作?告诉我确切的代码,否则我无法帮助你。
  • 好的,我已经更新了上面的代码。我试过读写,都导致同样的错误访问错误
  • 请将此self.labelInside!.center = self.center替换为self.labelInside?.center = self.center
猜你喜欢
  • 2022-06-21
  • 1970-01-01
  • 2016-10-06
  • 2015-12-08
  • 1970-01-01
  • 1970-01-01
  • 2021-06-23
  • 2016-04-19
  • 2018-07-17
相关资源
最近更新 更多