클래스 → 빵틀, 객체(object) → 빵(메모리)
즉, 메모리에 올린다.
(아직 이해가 덜 가지만, 이마저도 잊을까봐 일단 기록😭)
예제1
클래스
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)
}
}
}
객체
메모리에 올림
let aFriend = MyFriend()
let myFriend = MyFriend("만쥬")
실행
weak var aFriendToBeDestoried = MyFriend("개발하는 만쥬")
if aFriendToBeDestoried != nil {
aFriendToBeDestoried!.call()
} else {
print("객체가 더 이상 메모리에 없습니다.")
}
프린트
init() MyFriend 가 메모리에 올라갔다. 이름없음
init() MyFriend 가 메모리에 올라갔다. 만쥬
init() MyFriend 가 메모리에 올라갔다. 개발하는 만쥬
deinit() 메모리에서 사라짐 - 개발하는 만쥬
객체가 더 이상 메모리에 없습니다.
메모리에서 사라진 것은 deinit을 탄다.
메모리를 프린트하는 방법
// Unmanaged.passRetained(객체).toOpaque()
let anObjectMemoryAddress = Unmanaged.passRetained(aFriend).toOpaque()
let secondMemoryAddress = Unmanaged.passUnretained(myFriend).toOpaque()
print(anObjectMemoryAddress)
//0x000060000149edc0
print(secondMemoryAddress)
//0x00006000014d87c0
예제2
클래스
class Friend {
var name = "철수"
// 생성자 메소드 - 객체 생성시 발동
init() {
print("친구가 생겼어요! name : \(self.name)")
}
// 매개변수를 가지는 생성자 메소드
init(_ name: String) {
self.name = name
print("친구가 생겼어요! name : \(self.name)")
}
// 해당 인스턴스 객체가 메모리에서 할당 해제 될 때 발동
deinit {
print("친구가 없어졌어요.. name : \(self.name)")
}
// deinit 검증을 위해 작성
var calledTimes = 0
let MAX_TIMES = 5
static var instancesOfSelf = [Friend]()
class func destorySelf(object: Friend) {
instancesOfSelf = instancesOfSelf.filter {
$0 !== object
}
}
func call() {
calledTimes += 1
print("called \(calledTimes)")
if calledTimes > MAX_TIMES {
Friend.destorySelf(object: self)
}
}
}
객체
메모리에 올림
var myFirstFriend = Friend()
let mySecondFriend = Friend("영희")
인스턴스 메모리에서 해제
weak var selfDestructingObject = Friend("수잔")
if selfDestructingObject != nil {
selfDestructingObject!.call()
} else {
print("object no longer exists")
}
프린트
친구가 생겼어요! name : 철수
친구가 생겼어요! name : 영희
친구가 생겼어요! name : 수잔
친구가 없어졌어요.. name : 수잔
object no longer exists
반응형