我下面有一个简单的类(class)

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

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

最佳答案

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

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

这是您的计算属性:

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

查看getter的实现:
return self.test

它有什么作用?它读取当前实例的test属性,并返回它。 test属性是哪个?就是这个:
var test: NSNumber {
    get { return self.test }
    set {
        println(newValue)
        self.test = newValue
    }
}

是的,它是相同的属性。您的getter所做的是递归且无限期地调用自身,直到在运行时发生崩溃为止。

相同的规则适用于二传手:
self.test = newValue

它会不断调用自身,直到应用程序崩溃为止。

关于快速的二传手导致exc_bad_access,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31209615/

10-09 12:58