use*_*122 7 setter exc-bad-access swift
我下面有一个简单的课程
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;
}
}
Run Code Online (Sandbox Code Playgroud)
我在这里初始化它
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
var testClass = UsefulClass()
}
}
Run Code Online (Sandbox Code Playgroud)
但是由于EXC_BAD_ACCESS代码= 2,它会导致xcode打印出200 5s然后崩溃.为什么会发生这种情况?
Ant*_*nio 11
@vadian在他的回答中提供了一个解决方案,它可以解决你的问题.让我来解释一下发生了什么.
您已经创建了一个计算属性,即一个不受变量支持的属性,而不是getter和setter都经常在另一个存储属性上进行一些处理,以便分别返回一个值并设置一个新值.
这是你的计算属性:
var test: NSNumber {
get { return self.test }
set {
println(newValue)
self.test = newValue
}
}
Run Code Online (Sandbox Code Playgroud)
看看getter实现:
return self.test
Run Code Online (Sandbox Code Playgroud)
它有什么作用?它读取test当前实例的属性,并返回它.哪个test属性?就是这个:
var test: NSNumber {
get { return self.test }
set {
println(newValue)
self.test = newValue
}
}
Run Code Online (Sandbox Code Playgroud)
是的,它是同一个属性.你的getter所做的是以递归方式无限期地调用自身,直到在运行时发生崩溃.
同样的规则适用于setter:
self.test = newValue
Run Code Online (Sandbox Code Playgroud)
它一直在调用自己,直到应用程序崩溃.
默认情况下,Swift变量是合成属性.在大多数情况下这是足够的(建议更喜欢Swift类型)
var test: Int
override init() {
super.init()
test = 5
}
Run Code Online (Sandbox Code Playgroud)
如果在设置变量后需要执行某些操作,请使用
var test: Int {
didSet{
println("\(oldValue) - \(newValue)")
}
}
Run Code Online (Sandbox Code Playgroud)
你的代码通过调用setter调用setter来永久设置变量......
| 归档时间: |
|
| 查看次数: |
7236 次 |
| 最近记录: |