swift setter导致exc_bad_access
发布时间:2020-12-14 05:26:00 所属栏目:百科 来源:网络整理
导读:我下面有一个简单的课程 import Foundationpublic class UsefulClass: NSObject{ var test:NSNumber{ get{return self.test} set{ println(newValue) self.test = newValue } } override init() { super.init() self.test = 5; }} 我在这里初始化它 import U
我下面有一个简单的课程
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 它一直在调用自己,直到应用程序崩溃. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |