10월, 2021의 게시물 표시

ARC와 weak, strong, memory leak의 관계에 대한 정리

이미지
면접 질문에도 자주 등장하고, 스스로도 코딩을 하면서 자주 놓치게되는 부분이기에 실제 어떻게 사용해야하는지 되새길 겸 정리하려고 합니다. 먼저 단어들에대서 설명하고, 어떤 문제가 생길 수 있기 때문에 알고있어야 하는지 그리고 어떻게 해결할 수 있는지에 대해 순서대로 정리하도록 하겠습니다. ARC(Automatic Reference Counting) 이름에서 알 수 있듯이 자동으로 참조하고있는 숫자를 세어주는 녀석입니다. 그렇다면 참조숫자는 왜 필요할까요? 메모리1 - [객체1| 객체2 | 객체3 | 객체1을바라봄 | 객체1을바라봄 | 객체2를바라봄 | 객체3을바라봄 ||| 빈공간들 || ] 위와 같이 메모리를 사용하고 있는데 객체1이 메모리에서 사라지면 어떻게 될까요? 참조하러 갔는데 비어있으면 크래시가 나겠죠? 아니면 예상하지 못한 동작을 할 것 입니다. 그러므로 지금 메모리에 올라가 있는 이 녀석을 지워도 되는지 말아야 하는지에 대한 기준을 바로 ARC로 잡는 것입니다. ARC가 0이라면? 아무도 참조하고 있지 않으니 메모리에서 해제해도 아무런 이상이 없을 것 입니다. 반대로 0이 아니라면 어디선가, 누군가인지는 모르지만 사용하고 있으니 해제하면 안된다는 뜻으로 알고 메모리에 남겨둡니다. 개인적으로는 지하주차장 천장에 있는 녹색등과 초록등으로 이 아래에 차가 있는지 없는지 알려주는 장치와 비슷하다고 생각했습니다. 이 장치가 완벽하게 동작한다면 주차가 되어있다고 빨간불이 들어와있는 구역에 주차하러 왔다가 낭패를 보는 일은 없을테니까요. ㅎ ㅎ 메모리에서 해제해도 돼, 안돼! 그러면 ARC를 증가시키는 방법을 간단하게 살펴보겠습니다. import Foundation class Student { let name: String let grade: Int init (name: String , grade: Int ) { self .name = name self .grade = grade

정의된 프로콜을 보고도 감이 잘 안오는 분들을 위한 글

이미지
디자인 패턴을 공부하다 보니 protocol까지 흘러들어갔습니다. 문법책에있는 내용은 정말 빌드 시 에러가 나지 않을 만큼만 이라서 이 프로토콜을 정리 할 필요가 있다고 생각되었습니다. protocol 정의 protocol Student { var name: String { get } var grade: Int ? { get } } struct Leeo : Student { let name: String let grade: Int ? } let leeo = Leeo (name: "hyunho" , grade: nil ) print (leeo) 위와 같이 protocol이라는 키워드를 사용해서 프로토콜을 정의 해줍니다. 그리고 정의한 프로토콜을 채택해서 구현 해주어야 합니다. 프로토콜에는 크게 프로퍼티와 메소드를 정의 해줄 수 있습니다. 그러면 하나씩 어떻게 정의할 수 있는지 살펴보겠습니다. 프로퍼티 정의 프로토콜로 프로퍼티를 정의할 때는 크게 두가지가 신경 쓰입니다. let, var 의 정의 get set의 정의 먼저 let, var를 짚고 넘어가겠습니다. 프로토콜에는 let으로 정의할 수 없습니다. var로 정의해 놓은 변수를 let으로 구현할지 var로 구현할지는 구현하는 사람에게 달렸습니다. protocol Student { var name: String { get } var grade: Int ? { get } } struct Leeo : Student { let name: String let grade: Int ? } struct Vabat : Student { var name: String var grade: Int ? } let leeo = Leeo (name: "hyunho" , grade: nil ) let vabat = Vabat (name: "

adiOS 앱을 만들었습니다!

클로져(closures)에서 좌절한 사람을 위한 글

이미지
함수라고 알고 있던 클로져를 공부하면서 기록합니다. 어느 순간 이해가 안되는 코드들이 클로져로 이루어져있다는 것을 알게된다음 정리와 적용과정이 필요하다는 것을 알고 정리해 놓습니다. 클로저란? 클로저 는 코드에 전달되어 사용할 수있는 독립적인 기능 블록입니다. Swift의 클로저는 C 및 Objective-C의 블록 및 다른 프로그래밍 언어의 람다와 유사합니다. 라는 정의가 공식문서에 적혀있습니다. 하지만 이 개념은 이해가 가지 않았고, 개인적으로는 이름이 없는 함수이고 축약을 위한 다른 규칙들이 있다라고 이해하고 있습니다. 실제 저는 아래의 단계에 따라서 클로져를 공부하고 있더라구요. 비슷하거나 아니면 이에 해당하시는 분들은 미래를 예측 해 보시기 바랍니다. swift 문법을 공부합니다. 그리고 한 단원은 클로져입니다. 그래서 공부했습니다. 나는 클로져를 알고 있는데, 고차 함수인, map, fitler, reduce를 잘 몰라서 공부하다 보니까 클로져까지 왔습니다. 위에까지 다 공부해서 클로져를 알고 있다고 생각했는데 @escaping completeHandler: (() -> ())? 를 만나서 공부하다 보니 클로져까지 다시 오게 되었습니다. 이 전 단계를 다 공부하고 왔는데 아래와 같은 request { (result) in completed(.success( data )) } 코드를 보고 막혔다가 공부하러 왔습니다. 한 2개월에 한 단계씩 올라간 것 같습니다. 물론 순서대로는 아니지만 생각보다 한번의 예제나 하나의 실습으로 익혀지지 않는 것은 확실한 것 같네요. 클로저의 문법 간단한 함수의 생김새와 사용방법 let name = "Leeo" func printName () { print (name) } printName() // Leeo 간단한 클로져의 생김새 let name = "Leeo" let print Name = { print (name) }

모달이 사라진 뒤 테이블 뷰 업데이트 하는 방법

이미지
iOS 개발을 하다보면, 내가 만든 UI에게 지금 일어나고 있는 일을 전달하고 싶을 때가 있습니다. 이 때 내가 원하는 기능을 동작하게 하는 방법은 다양합니다. 내가 하고 있는 일이 어떤 것인지, 정리 해보도록 하겠습니다. 크게 3가지 방법이 있습니다. Notification , Delegate , closure . 이 것들에 대한 비교는 더 자세하고 좋은 글들이 많으니 실제 사용 측면에서 보면 좋을 것 같습니다. 실제 환경 우리는 아래와 같은 코드가 있다고 합시다. 제가 가장 고민없이 만들 수 있는 테이블 뷰 입니다. :) 이해하는데 어렵지는 않죠? add 버튼을 누르고 nameTextField에 이름을 입력하고, 버튼을 누르면 리스트에 추가되는 구조 입니다. // ViewController.swift import UIKit var items: [ String ] = [ "Leeo" , "Hyunho" , "Vabat" ] class ViewController : UIViewController { @IBOutlet weak var tableView: UITableView ! override func viewDidLoad () { super .viewDidLoad() tableView.delegate = self tableView.dataSource = self } @IBAction func didTapAddButton ( _ sender: Any) { let vc = (storyboard?.instantiateViewController(identifier: "AddViewController" )) as ! AddViewController vc.parentsViewController = self present(vc, ani