打印变量、常量内存地址
func printAddress(any:Any,des:String) {
print("\(des) = \(Unmanaged<AnyObject>.passRetained(any as AnyObject).toOpaque())")
}
func printAddress(any:Any) {
print("\(Unmanaged<AnyObject>.passRetained(any as AnyObject).toOpaque())")
}
对象间的循环引用
// 可选值属性比较好处理,加weak就可以, 非可选值属性需要 隐式解析 + unowned
class People {
unowned var stu:Student
init(parama:Student) {
stu = parama
}
deinit {
print("people被释放")
}
}
class Student {
var people:People!
init() {
people = People.init(parama: self) // 隐式解析可以忽略构造方法中的安全性原则,其告诉编译器,默认此属性是构造完成的
}
deinit {
print("student被释放")
}
}
if true {
var stu = Student.init()
var peo = stu.people
}
闭包是一种特殊的语法结构,在其中使用的引用类型的实例都会使引用计数加1。因此,如果在闭包属性中使用到self关键字,就会对当前类实例本身进行引用计数加1。由于此闭包又是当前类的一个属性,闭包属性无法销毁,则当前类实例也就无法销毁。反过来,当前类实例无法销毁,闭包属性也无法销毁。如此产生循环引用,将造成内存泄漏。
class People {
var name = "HH"
var home:String?
lazy var closeBlock:()->Void = {
// 使用捕获列表对闭包中使用到的self进行无主引用
[unowned self]()->Void in
print("a = \(self.name),\(self.home)")
}
deinit {
print("People被释放了")
}
}
if true {
var p = People.init()
p.closeBlock()
}
网友评论