Language/Swift-Basic

Swift - 객체 생성자, 해제자

Jessi :D 2022. 2. 24. 06:24

클래스 → 빵틀, 객체(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

 

반응형