import UIKit
class MyFriend {
var name : String
init(_ name: String = "이름없음"){
self.name = name
print("init() MyFriend 가 메모리에 올라갔다. - ", self.name)
}
deinit{
print("deinit() 메모리에서 사라짐 - ", self.name)
}
// deinit 검증을 위해 작성
var calledTimes = 0
let MAX_TIMES = 5
static var instancesOfSelf = [MyFriend]()
class func destorySelf(object: MyFriend){
instancesOfSelf = instancesOfSelf.filter{ (aFriend : MyFriend) in
aFriend !== object
}
}
func call(){
calledTimes += 1
print("called \(calledTimes)")
if calledTimes > MAX_TIMES {
MyFriend.destorySelf(object: self)
}
}
}
var myFriend = MyFriend("쩡대리")
let aFriend = MyFriend()
// 메모리에 올라감
// Unmanaged.passUnretained(객체).toOpaque()
// 로 해당 객체의 메모리 주소를 프린트 할 수 있습니다.
let anObjectMemoryAddress = Unmanaged.passUnretained(aFriend).toOpaque()
let secondMemorryAddress = Unmanaged.passUnretained(myFriend).toOpaque()
print(anObjectMemoryAddress)
print(secondMemorryAddress)
weak var aFriendToBeDestoried = MyFriend("개발하는 정대리")
if aFriendToBeDestoried != nil {
aFriendToBeDestoried!.call()
} else {
print("객체가 더 이상 메모리에 없습니다.")
}
💡 뭔가 어려운데 결론은 메모리에서 사라지면 deinit()이 호출된다는 것!
ARC에 대해서는 나중에 더 알아보자!