기어가더라도 제대로

AppElements 본문

기타

AppElements

Damagucci-juice 2022. 2. 21. 23:36
본 글은 공부용 글입니다. 잘못된 경우 바로 잡아주시면 감사하겠습니다.
질문은 하셔도 좋지만, 큰 도움은 못드릴 가능성이 많습니다.

JK의 한마디

여러 기능이 xcode에도 많으니 호기심 가는 대로 눌러 보세요. macbook이 터지진 않을겁니다.
print로 하지 마세요. break point에 양보하세요.
* 원하는 라인에 브레이크 포인트
* add action
* sound option
* @print(self)@

앱의 구성요소

image

iOS 앱용 프로젝트를 생성하면 생기는 7개의 파일을 알아야한다.
(밑의 사진에서 프로젝트 폴더에서 AppDelegate ~ info까지)

image

AppDelegate

프로젝트를 생성하면 보이는 친구들 중에 대장격이다. 이 해당 델리게이트가 작동을 해야 앱이 동작을 한다. 앱 델리게이트는 Main Thread에서 runLoop로 무한 루프를 돌고 있다. 특정한 명령이 나오기 전에는 항상 작동하기 위해서 그렇다.

Delegate : 어떠한 인스턴스가 있고, 그 인스턴스가 수정한 정보값을 전달해주는 대리인. (App을 직접 다루지 않고, AppDelegate를 핸들링)

  • 모든 App에서 공통적인 역할을 한다.
  • App이 시작하면 첫 번째로 접근하는 인스턴스
  • @main을 제거하면 main.swift를 따로 생성해서 가지고 있어야함.

image

출처 : 코드스쿼드 내부 자료(private)

앱의 시작점이고, 무한루프를 돌고 있는 점이 인상적이다.

SceneDelegate

  • iPad에서 분할 화면을 하거나, 여러 창을 띄워 놓을 때 관리하는 델리게이트

LaunchScreen.storyboard

시작시 로딩 화면을 보여주는 스토리보드이다. 그 뿐 아니라, 앱의 화면 사이즈를 알리는 역할도 한다.

Info.plist

프로젝트의 메타정보를 포함하는 property list
하드웨어에 접근하거나, 어플리케이션이 더 로우한 레벨 까지 접근할 때 권한을 설정하거나 프로젝트 관련된 설정을 담고 있음
실제로 네비게이터 에리어에 있는 파일을 편집해도 되지만 요즘은 프로젝트 타겟에서 info를 설정하는 것을 권장하는 추세


Xcode와 친해지기

지원하는 시뮬레이터 삭제해보기

xcode를 설치하면 상당히 많은 시뮬레이터를 설치해서 용량을 많이 잡아 먹는다. SSD용량이 넉넉치 않다면 주로 사용하는 시뮬레이터 이외에 시뮬레이터는 삭제해주어도 좋다.(거의 50GB) 주로 남겨 놓으면 좋은 시뮬레이터들은 노치가 있는 기종들이다.

추천 기종

  • iPhone 11(pro),
  • iPhone13(mini, pro, pro_max)

각종 꿀팁

  • opt + [+] : objects 창 미리 띄워 놓기
  • 상속 받을 새파일을 생성할 땐, Cocoa Touch Class

프로젝트를 만든다고 치면?

image

foo.pbxproj

  • 실제 프로젝트이다. 말이 좀 어려운데, xcode가 바라보는 프로젝트 알맹이라고 이해했다.
  • 충돌이 나면? xcode에서 열기 어려우므로, txt editer로 여는 것을 추천한다.
  • 외부 라이브러리가 없다면, 이 파일로 실행해도 된다. 있다면? cworkspace로 열길 추천
  • 프로젝트의 설정파일들이 있는 디렉터리

bar.cworkspace

  • xcworkspace는 workspace와 프로젝트들에 대한 설명하는 파일이 들어 있는 디렉토리 입니다.
  • 외부 라이브러리 등을 내 프로젝트에 추가한 경우에 필요한 파일이며 내 프로젝트와 라이브러리를 연결해주는 역할을 한다.

xcuserdata

  • xcode에서 다루는 아주 사소한 설정의 정보를 담고 있는 부분,
    • 예를 들어 네비게이터 에리어에서 파일의 순서를 변경한 경우에도 이 디렉터리는 변한다.
  • 프로젝트를 생성하자마자 ignore 하는 것을 추천한다.

Build, Build를 보자! (feat. Target)

스위프트로 프로그램을 작성하면 실행하기 전에 빌드를 해야한다.
일종의 실행 파일을 만드는 것이라고 생각하면 좋다.
이제 이 빌드 파일은 무엇이며, 여기서 타겟의 역할은 무엇인지 살펴보자.

일단 Target의 수준에서 빌드를 해 프로젝트를 설정한다. > target

Target은 무엇일까?

개별 제품을 빌드하는 최소 단위

Screen Shot 2022-02-21 at 10 28 53 PM

원하는 플랫폼마다 타겟이 조금씩 차이가 나는 것을 볼 수 있다.
유닛 테스트 단위인 XCTest도 타겟의 한 종류가 아닌가 하는 추측을 하고 있다.

Build의 구성

command + : build를 하여 실행파일만 만듦. 실행파일을 실행까지 시키는 cmd+R 옵션과 차이
show build folder로 빌드된 파일을 볼 수 있다.

image

빌드는 4 단계(Phase)를 거쳐야 완성이 된다.

  1. Dependency : 외부 라이브러리 타겟이 들어간다. 디펜던시를 체크해서 외부에서 받아와야하는 라이브러리가 있는지 확인한다.
  2. compile source : 작성한 코드 뭉치들이 들어가는 단계이다. 대표적으로, AppDelegate, main.swift 등이 있다.
  3. Link Binary with Libraries : 라이브러리를 binary에 적용하는 단계인가? 잘 이해가 안된다. 질문을 한 후에 수정해야겠다. 예로 mapkit,UIKit 등을 적용한다 하면, 지금 단계에서 빌드 파일에 적용하는 듯하다.
  4. Copy Bundle Resources : 번들 파일들을 포함하는 단계이다. Assets, storyboard등이 여기서 빌드 파일에 담긴다.

주의
어느 phase에서 오류가 나는지에 따라 해결 방법이 다르다.
그래서 빌드 오류가 나타나면 error log를 대충은 알아보는 습관을 들이자.

local과 remote

host가 코드를 작성하는 부분을 일반적으로 local이라고 하고, 이를 배포하는 서버를 remote라고 한다.

시뮬레이터 VS 에뮬레이터

면접 단골 질문 주제를 정리해 보자

시뮬레이터

호스트가 본인 환경에 맞춰 빌드(환경이라 하면 CPU의 환경을 의미함, intel인지 amd인지)
target 환경에서 쓸 수 없음 -> target과 비슷한 환경에서 실행

  • 타겟에서 동작과 동일하지 않을 수 있음

에뮬레이터

호스트에서 Target의 아키텍처로 빌드를 해서 Target과 동일한 환경에서 실행
구현이 까다롭다는 단점이 있지만, 구현만 하면 타겟과 호스트가 100% 동일한 환경이다.

네이티브

호스트 아키텍처로 빌드해서 호스트에서 실행하거나
타겟 아키텍처로 빌드해서 타겟에서 실행하는 경우

Sub_project 와 Workspace

전자는 Main project가 있으면 그 밑에 sub-Project가 존재하는 모형이고,
후자는 같은 수준의 project들이 각기 한자리씩 차지하고 있는 모형이다. 이 경우에 빌드 설정과 같은 디렉터리를 공유한다.

Scheme

로봇이 프로젝트를 다룰 때 어떻게 빌드할 것인지에 대한 권한이나 빌드 옵션을 정의해 놓은 부분.. 어렵다.
왜 어렵냐 하면, 나같은 개인적으로 코드를 짜는 사람은, 프로젝트의 모든 권한을 가지고 작업하기 때문에, 권한을 나눠본 경우가 없어서 그런듯하다.
회사라고 하면, 어느 팀은 테스트만 할 수 있는 권한을 주고, 어느팀은 빌드만 하고, 어느팀은 배포만 하고 이런 것을 나눠놓는 부분인거같다.

Unit Test

코드로 이루어지는 부분을 제대로 실행이 되었는지 테스트 할 수 있다.
다만 해당 함수나 클래스가 정의되어 있는 파일에서 인스펙터 > 타겟 멤버 에서 test build 파일을 선택해주어야한다.

image
  • 생성방법
    File > NEW > Target > Unit Test Targetimage

참고

JeongUPark의 블로그
iOS, CODESQUAD

Comments