尝试设置或获取实例变量时出现错误访问错误

时间:2015-11-29 10:59:59

标签: ios xcode swift swift2 xcode7

我正在尝试制作一个将标签拖动到正确框中的场景。但我得到一个"线程1:EXC_BAD_ACCESS(代码= 2,着装= 0x107867618)"每当我尝试访问任何框的labelInside变量时,都会出错,无论是设置还是检索它。香港专业教育学院尝试检查与僵尸的解除分配但没有找到任何东西。我也尝试删除getter和setter,只是简单地将其设置为其中一个标签,但即使这样,它也会在检索时崩溃。根据我的研究,我认为它可能是一个腐败的指针,或者课程没有正确初始化,但我完全坚持如何解决它。我的代码" LabelBox"它崩溃的功能如下。任何帮助将非常感谢!谢谢。

int removeZeros(int candid)
{
     int output = 0;
     string s(itoa(candid));
     for (int i = s.size(); i != 0; --i)
     {
         if (s[i] != '0') output = output * 10 + atoi(s[i]);
     }
     return output;
}

1 个答案:

答案 0 :(得分:0)

了解您如何定义setter

labelInside
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

但在你的内心深处

self.labelInside = newLabel

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

self.labelInside = newLabel

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

只需从您的二传手中删除此行即可。

self.labelInside = newLabel

修复#2

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

这一行

self.labelInside!.center = self.center

应更改如下

self.labelInside?.center = self.center

修复#3

好的,请尝试更新您的setter,如下所示

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