swift setter导致exc_bad_access

我下面有一个简单的课程
import Foundation

public class UsefulClass: NSObject{
    var test:NSNumber{
        get{return self.test}
        set{
            println(newValue)
            self.test = newValue
        }
    }
    override init() {
        super.init()
        self.test = 5;
    }
}

我在这里初始化它

import UIKit

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        var testClass = UsefulClass()
    }
}

但是由于EXC_BAD_ACCESS代码= 2,它导致xcode打印出200 5s然后崩溃?为什么会发生这种情况?

@vadian在他的回答中提供了一个解决方案,它可以解决你的问题.让我来解释一下发生了什么.

您已经创建了一个计算属性,即一个没有变量支持的属性,而是getter和setter都经常在另一个存储属性上进行一些处理,以便分别返回一个值并设置一个新值.

这是你的计算属性:

var test: NSNumber {
    get { return self.test }
    set {
        println(newValue)
        self.test = newValue
    }
}

看看getter实现:

return self.test

它有什么作用?它读取当前实例的test属性,并返回它.哪个测试属性?就是这个:

var test: NSNumber {
    get { return self.test }
    set {
        println(newValue)
        self.test = newValue
    }
}

是的,它是同一个属性.你的getter所做的是以递归方式无限期地调用自身,直到在运行时发生崩溃.

同样的规则适用于setter:

self.test = newValue

它一直在调用自己,直到应用程序崩溃.

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...