gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 01:26:16 25 4
gpt4 key购买 nike

我正在尝试制作一个场景,您可以将标签拖到正确的框中。但是每当我尝试访问我的任何盒子的 labelInside 变量时,无论是设置还是检索,我都会收到“线程 1:EXC_BAD_ACCESS(代码=2,连衣裙= 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
}

最佳答案

看看你如何定义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

但是在二传手里面你有

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

关于ios - 尝试设置或获取实例变量时出现访问错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33982019/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com