iOS 개발/Swift

    Swift Hashable을 이해하자

    Swift Hashable을 이해하자

    class SomeObject: Hashable 어떤 객체가 Hashable 프로토콜을 채택해서 따른다. 즉, 어떤 객체가 Hashable 하다는 것은 무슨 말일까요? 이 질문에 대답할 수 있으려면, Hashable한 객체가 어디에 사용되는지를 알아야 합니다. 결론부터 말씀드리면!! Hashable한 객체는 Hash Table에 저장될 수 있어요! 1. Hash Table이 뭘까? Hash Table은 Collection 타입의 저장 방식의 한 개념인데, (index 방식 : Array, Hash Table 방식 : Set, Dictionary) index를 기반으로 저장되는 Array의 개념과 달리 Hash Table은 객체의 Hash값을 기반으로 저장됩니다. 쉽게 이야기하면, 객체의 Hash값이 객체..

    [Swift] iOS는 화면을 어떻게 렌더링할까?

    [Swift] iOS는 화면을 어떻게 렌더링할까?

    개발자 아카이브 문서에 따르면, iOS에서 화면에 그리는 모든 작업(OpenGL, Quartz, UIKit 또는 Core Animation 포함 여부와 관계없이)은 UIView 클래스 또는 그 하위 클래스의 인스턴스 범위 내에서 발생한다고 합니다. 앱이 iOS 운영체제 위에 올라가 실행되고 나서 유저에게 보여지기까지 어떤 일이 일어나는지 한번 알아보죠! 요약: 1. iOS는 draw(_ :)을 이용하여 그리기 작업을 한 후 CALayer마다 가지고 있는 backing store(프레임 버퍼)에 저장하거나, 그림자, 반사 등 복잡한 작업의 경우 Offscreen Rendering을 이용하여 GPU에서 계산한 뒤 Offscreen 버퍼(임시 프레임 버퍼)에 저장합니다. 2. 이렇게 작업된 결과물들이 저장된 ..

    [Swift] Struct와 Class를 메모리 원리부터 자세하게 비교해보자

    [Swift] Struct와 Class를 메모리 원리부터 자세하게 비교해보자

    Understanding Swift Performance - WWDC16 - Videos - Apple Developer In this advanced session, find out how structs, classes, protocols, and generics are implemented in Swift. Learn about their relative... developer.apple.com WWDC Understanding Swift Performance 영상을 참조하여 좀 더 원리적인 이해를 돕기 위해 작성한 포스트입니다. 기초적인 스레드와 메모리, 그리고 ARC에 대한 지식이 있어야 이해하기 편하실거에요! 1. 미리 요약 좀 자세하게 이야기를 할 예정이라 먼저 요약을 하고 들어갈게요! (공부..

    [ARC] 성능을 위해 unowned를 꼭 써야할까?

    [ARC] 성능을 위해 unowned를 꼭 써야할까?

    (재미로 봐주세요..ㅎㅎ) unowned를 쓰는 것은 불편합니다. 왜냐면 unowned로 참조한 친구가 사라져버리면 그 포인터가 가리키는 값이 댕글링 포인터가 되어버려서 터질 수도 있기 때문이에요. 사실 Unowned로 선언하면 옵셔널 체이닝을 안해도 되는 간편함이 있긴 하지만, 차라리 옵셔널 체이닝을 하더라도 터지지 않는 앱을 위해 상황 하나 하나를 다 들여다보는게 더 귀찮더라고요. 그래서 전 그냥 weak를 쓰지만, 쓸 때마다 마음에 부채가 생겼습니다...;; 내가 엄청난 성능적 죄악을 저지르고 있는 것이 아닐까? 애플이 unowned를 괜히 만들지는 않았을텐데... 대충 이런 느낌... 그래서!!! 과연 얼마나 성능에 영향을 미치는지 테스트를 해봤습니다. 테스트는 할당과 해제를 많은 수로 반복하면서..

    [ARC] Lazy 변수 클로저에서 Unowned 캡처가 항상 안전할까?

    [ARC] Lazy 변수 클로저에서 Unowned 캡처가 항상 안전할까?

    정말 오랜만에 글을 쓰네요!! 열심히 논 건 아니고 운영체제 공룡책을 공부하는 폐관수련을 하느라 다른 걸 거의 하지 못했는데, 공부 할 수록 점점 "CS는 무조건 깊게 공부하자!"라고 외치는 개발자가 되어가는 것 같아요. (점점 올드해지는 느낌) 곧 OS에 대한 시리즈와 클린아키텍처에 대한 시리즈도 쏟아져 올라갈 예정이니 많은 관심 부탁드립니당~ 최근에 어떤 글을 보았는데, Lazy변수에서 self에 접근하는 경우, self는 값이 있음을 가정하므로 [weak self] 뿐만 아니라 [unowned self]를 사용하여 self에 대해 접근할 수 있다고 하더라고요! 근데 이 말을 보는데 계속 의문이 들더라고요. 과연 안전할까? 물론 시작할 때 있다는 건 보장이 되는데, 실행하는 중간에도 있다는 건 어떻게..

    [Concurrency] Semaphore로 비동기적 이벤트를 동기적으로 발생시키기

    [Concurrency] Semaphore로 비동기적 이벤트를 동기적으로 발생시키기

    운영체제를 보다가 오랜만에 Semaphore를 만났는데 예전에 C로 철학자 문제를 만들어본 적은 있지만 Swift에서는 아직 제대로 사용해본 적이 없더라고요! "이걸로 뭔가 간단한걸 만들어보고 싶은데 뭘 만들지?" 고민하다가 정말 의미없는 무언가를 만들어내었습니다! 바로.....!! 버튼을 한번 누를 때마다 2초후에 값을 증가시키는 앱이에요! 버튼을 여러번 클릭한 경우, 단순히 2초 후에 한번에 올려주는 것이 아니라 2초마다 하나씩 하나씩 올려주는 작동을 합니다ㅎㅎ 영상에서 아래쪽은 버튼 누른 횟수가 증가하고, 위쪽은 전달된 이벤트가 2초의 텀을 두고 동기적으로 실행되는데요, 당연히 User Interaction등이 막히는 일이 있어서는 안되겠죠?? 어떻게 만들지 한번 머릿속으로 구상해보세요!! 버튼을 ..

    [ARC] 약한참조(Weak, Unowned)에 대해서

    [ARC] 약한참조(Weak, Unowned)에 대해서

    인스턴스가 메모리에서 해제되기 위해서는 reference count가 0이 되어야하는데, 0이 되지 않는다면 메모리에 계속 남겨져서 memory leak 이 일어나게 됩니다. 어떤 경우에서 memeory leak이 일어나게 되는 걸까요? 대표적인 예시로 순환참조가 있습니다. 1. 순환 참조 상황 이해하기 먼저 순환참조는 두 개 이상의 객체가 서로 강하게 참조하는 상태를 의미합니다. 사실 순환참조는 피해야 하는 안좋은 방식입니다! 단순히 memory leak이 어떻게 일어나는지 보여주는 예시일 뿐이지, 우리가 객체를 이렇게 구성하면 안됩니다. 순환참조를 사용하게 되면 의존성에 문제가 생기게 됩니다. 컴포넌트 간의 경계가 명확해야 하는데 그러지 못하게 되고 하나가 변경되게 되면 다른 객체가 변경되는 등의 문..

    [Swift] 지정한 For-Loop 탈출하기

    Swift로 알고리즘을 풀어보면서 파이썬만큼은 아니지만 편리한 도구들을 많이 마련해 놓았다는 생각이 드는데요. 오늘은 그 중에서 지정한 For-Loop 를 한번에 break 하는 방법을 소개드리려고 합니다 :) 사실 이런 것들은 있는 줄 몰라서 못쓰는 것들이 대부분이잖아요? 이런 도구들을 틈틈히 정리해보려고 합니다! 그냥 아무런 쓸 때 없는 3중 For-Loop를 만들어볼게요. for i in 1...10 { // 첫번째 Loop for j in 1...10 { // 두번째 Loop for k in 1...10 { // 세번째 Loop print(i, j, k) } } } 여기서 만약에 특정 조건일 때 두번째 Loop에서 break 하고 싶으면 어떻게 해야 할까요? 여기서는 i, j, k가 모두 같을 때..

    [Swift] Stride 함수를 사용하자

    알고리즘을 풀고 다른 사람들의 답을 훑어보던 도중 stride라는 함수를 발견했는데, 엄청 편리한 것 같아서 정리해볼게요ㅎㅎ 먼저 stride 함수에 대해서 간단히 말하자면 For-Loop 문 (for문)에서 컨트롤 하는 index에 특정한 범위를 주는 역할을 해요. for 문을 사용할 때, index로 무언갈 하고 싶은 적이 많을텐데, 무조건 하나씩 올라가야 하는 문제 때문에 불편한 기억이 많으실텐데요. stride를 쓰면, 시작점과 끝 지점, 얼마나 띄어서 세고 싶은지, 양수 방향으로 세고 싶은지 등을 컨트롤 할 수 있어요! 간단하게 예시를 한번 들어볼게요! 다음 코드는 2부터 5까지의 배수 중 10 이하를 출력하는 코드에요 for outside_idx in 2...5 { for inside_idx ..