- 클래스 - 인스턴스를 만들기 위한 틀, 속성과 행동을 갖는다.
- 인스턴스 - 클래스를 토대로 만들어진 객체, 속성을 갖는다. 행동은 클래스에 있다.
- 객체 - 실체, 관련된 것들의 모음.
Memory Allocation: Stack or Heap
Reference Counting: Yes or No
Method Dispatch: Static or Dynamic
일정 크기 이상으로 증가하면 스토리지는 값을 힙에 할당하고 그 힙을 가르킨다.
해당 스토리지는 스택에 존재한다.
struct 내부에 class가 존재할 경우 rc를 사용한다.
글에 들어가기 앞서 mvc 이론적인 부분이 아닌, 실제로 프로젝트에 적용할 때 필요한 정보에 대해서 정리했다.
model에서 viewcontroller로 정보를 보내는 건 model이 viewcontroller를 알고 있는 것처럼 느껴지지만, 사실 아래에 있는 두 가지 선택 중 어느 걸 선택하더라도 viewController가 model을 감시하는 구조이다. model은 viewController을 몰라야 한다.
-
KVO observer에게 감시받는 속성을 갱신한다.
extension Model: ViewDataSoure, Datable { func someMethod(newData: Data) { self.information = newData } ... }
-
Notification notification center로 정보를 전송한다.
NotificationCenter.default.post(name: NSNotification.Name("model"), object: nil, userInfo: ["information": game])
모델 객체는 뷰 객체나 뷰 프레임워크에 의존하지 않고 독립적으로 만들어야 한다. - JK
view에서 event가 발생한 걸 viewController로 보내기 위해 delegate 패턴을 사용한다.
weak var datasource: ViewDataSource?
var data: Datable?
@objc func didTouchedButton() {
datasource.someMethod(newData: someData)
}
view객체에서 신경 써야 할 부분은 model객체를 모르는 것이다. datasource라는 속성을 구현해주는 대상을 몰라야 한다.
하지만 정보를 받아올 때 "model을 사용할 수밖에 없는 게 아닌가." 의문점이 드는데 이 부분을 프로토콜의 다형성을 사용한다.
model이 특정 프로토콜을 채택하게 만들어서 view에서는 그 특정 프로토콜을 받도록 만든다.
다른 객체를 참조하는 경우에는 구체 타입에 의존하지 않고, 프로토콜에 의존하도록 만든다. -JK
mvc 패턴에서 가장 중요한 역할을 하는 viewController, __view와 model의 존재를 알고 있는 존재__로서, event가 발생하면 model과 view를 묶어주는 역할을 담당한다.
view에서 받은 자료를 model로 전달한다.
override func viewDidLoad() {
...
view.datasource = model
}
model에서 받은 정보를 view에게 넘겨준다.
-
KVO
observer = dataManager.observe(\.model) { _, model in view.data = model.newValue }
-
Notification
NotificationCenter.default.addObserver(self, selector: #selector(pushInformationToView), name: NSNotification.Name( "model"), object: nil) @objc func pushInformationToView(_ notificaiton: Notification) { .... notifiaction.userInfo 사용 }
mvc 패턴의 작동을 시간 순으로 나태는 그림이다.