我下面有一个简单的课程
- 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
它一直在调用自己,直到应用程序崩溃.