我下面有一个简单的课程
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物业?就是这个:
test
是的,它是相同的属性。您的getter所做的是递归且无限期地自我调用,直到在运行时发生崩溃为止。
相同的规则适用于二传手:
self.test = newValue
它会不断调用自身,直到应用程序崩溃为止。