[Xcode] 기본 환경 설정 및 info.plist 알아보기 (1)

김민석·2021년 7월 19일
4

Xcode

목록 보기
1/10

Project 생성시 기본화면에 대해 알아보자.

Info

Xcode에서 가장 먼저 프로젝트 생성시 다음과 같은 기본화면을 볼 수 있습니다. 이 설정들을 차근차근 하나씩 알아가봅니다.
먼저 info에 있는 Deployment Target에 대해 알아봅시다.
Deployment Target 속성에는 iOS Deployment Target이 존재하는데 이는 최소 OS 지원 버전을 설정해 줄 수 있습니다.
저는 14.3으로 되어있는데 이는 iOS 14.3 버전 이상에서 사용가능하고, 이 버전의 기능들을 사용할 수 있습니다.

다음으로 Configuration 항목이 있습니다.
빌드 기본구성은 Debug, Release로 되어있습니다.
Debug 모드는 실행파일에 디버깅 정보를 포함하여 속도가 릴리즈모드에 비해 느립니다.
Release 모드는 코드를 최적화하여 실행파일의 크기를 최대한 줄여 디버그 모드에 비해 빠릅니다.
Release 모드는 AppStore에 올라가는 환경이라고 할 수 있습니다.

기본 구성은 두가지로 되어있지만 베타버전 등 다양한 환경에서 테스트를 진행하는 경우가 있습니다.
이러한 경우에는 configuration을 추가하는 방법으로 왼쪽 하단에 '+' 버튼을 눌러 configuration을 추가 할 수 있습니다.

다음으로 Localization에 대해 알아봅시다.
이는 언어를 설정해 줄 수 있습니다. Base는 영어로 되어있습니다.
하단에 '+' 버튼을 클릭하여 다른 언어를 선택할 수 있습니다.
예를들어 korean 파일을 만들었을때는 기본 언어가 korean으로 설정되어 있는 경우에는 korean이 적용되고 그 이외에는 영어로 보인다는 의미입니다.

Building Settings

이제 info 탭을 지나 Build Settings 탭으로 넘어가 봅시다.
먼저 "Customized"와 "All" 옵션이 보이는데
Customized는 Customized된 값들만 모아서 볼 수 있습니다. 즉, 기본값이 아닌 Build Setting 값들만 모아봅니다.
All 옵션은 모든 값을 볼 수있습니다. All 옵션으로 보아도, 기본값이 아닌 값들은 굵게 표시되어 있어서 확인할 수 있습니다.

Architectures

아키택쳐는 직역하면 건축학이라는 뜻입니다.
소프트웨어적인 의미로는 소프트웨어의 구성요소들 사이에서 유기적 관계를 표현하고 소프트웨어의 설계와 업그레이드를 통제하는 지침과 원칙이라고 할 수 있습니다.

이제 Architectures 항목을 세부적으로 알아봅시다.

Architecture
Product가 만들어질 아키텍처의 목록입니다.
일반적으로 이 설정은 플랫폼에서 제공하는 미리 정의된 빌드 설정으로 설정됩니다.
둘 이상의 아키텍처를 지정하면 범용 이진파일이 생성됩니다.

Base SDK

빌드하는 동안 사용되는 기본 SDK의 이름 또는 경로입니다. Product는 지정된 SDK 내에 있는 헤더 및 라이브러리를 기반으로 구축됩니다. 이 경로는 모든 검색 경로에 추가되고 환경을 통해 Compiler와 linker로 전달됩니다.

추가 SDK는 'Additional_SDKS' 설정에서 지정할 수 있습니다.

SDK(소프트웨거 개발 키트) : SDK는 일반적으로 소프트웨어 기술자가 사용하여 특정한 소프트웨어 꾸러미, 소프트웨어 프레임워크, 하드웨어 플랫폼, 컴퓨터 시스템, 게임기, 운영 체제 등을 위한 응용 프로그램 등을 만들 수 있게 해주는 개발 도구의 집합

Build Active Architecture Only
활성화된 경우 활성 아키텍쳐만 빌드됩니다.
이 설정은 'Generic Device' 실행 대상과 같은 특정 아키텍처를 정의하지 않는 실행 대상으로 빌드할 때 무시됩니다.

Excluded Architecture
대상이 작성되지 않아야 하는 아키텍처 목록입니다. 이러한 아키텍처는 대상이 구축되면 ARCHS의 목록에서 제거됩니다.
결과 아키텍처 목록이 비어있으면 이진 파일이 생성되지 않습니다. 이것은 ARCHS가 상위 레벨(ex : xcodebuild)에서 재정의되는 환경에서 대상이 지원하지 않는 아키텍처를 선언하는데 사용될 수 있습니다.

Supported Platforms
기본 SDK를 사용할 수 있는 지원되는 플랫폼 목록입니다.
서로 다른 SDK를 사용하여 여러 플랫폼에 대해 제품을 빌드할 수 있는 경우 이 설정이 사용됩니다.

다음으로는 Asset 항목을 살펴봅시다.

Asset

Asset은 다양한 디바이스에서 사용하기위한 리소스파일 입니다.
이러한 에셋들을 관리하기위한 폴더인 Assets.xcassets 가 있습니다.

Asset Pack Manifest URL Prefix
빈 문자열 이외의 문자열로 설정하면 'AssetPackMainfest.plist' 파일의 모든 URL은 Asset pack 이름이 추가된 이 문자열로 구성됩니다.
설정하지 않으면 Asset pack의 빌드 위치에 맞게 'AssetPackMainfest.plist'의 URL이 구성됩니다.
prefix string은 이스케이프되거나 따옴표가 없으므로 필요한 이스케이프는 URL의 문자열의 일부여야 합니다.
이 설정은 'AssetPackMainfest.plist' 파일의 URL에만 영향을 미치며 로컬 파일 시스템에서 Asset 팩을 빌드하는 위치에 영향을 주지 않습니다.

Build Options

Build Options는 말 그대로 Build과 관련된 Option들이 있을거라고 생각합니다.
하나씩 차근차근살펴보겠습니다.

Debug Information Format

생성할 디버그 정보의 유형입니다.
[DWARF] : 개체 파일과 링크된 제품은 DWARF를 디버그 정보 형식으로 사용합니다.
[dWARF] : (DWARF와 dSYM 파일) 오브젝트 파일과 링크된 제품은 디버그 정보 형식으로 DWARF를 사용하고, Xcode는 개별 오브젝트 파일에서 디버그 정보를 포함하는 dSYM 파일도 생성합니다. ( dSYM 파일은 필요하지 않으며 정적 라이브러리 파일 또는 오브젝트 파일 Product에 대해 생성되지 않습니다.)
제 프로젝트는 Debug 모드는 DWARF로 되어있고, Release는 dWARF로 되어있습니다. (따로 설정해주지 않았습니다.)

Enable Testability
설정이 활성화되면 테스트에서 개인 인터페이스에 엑세스 할 수 있도록 하는 등 자동화된 테스트를 실행하는데 적합한 옵션으로 제품이 구축됩니다. 이로 인해 테스트 실행속도가 테스트 기능을 활성화하지 않은 경우보다는 느려질 수 있습니다.

Validate Built Product
활성화된 경우 빌드 프로세스의 일부로 Product에 대한 유효성 검사를 수행합니다.

Deployment

Strip Debug Symbols During Copy
빌드 중에 copy되는 이진 파일(ex: Copy Bundle Resource 또는 Copy Files)의 디버깅 기호를 제거할지 여부를 지정합니다.
대상의 링크된 제품이 제거되는 것은 아닙니다.
이 경우 'STRIP_INSTALLED_PRODUCT'를 사용하면 됩니다.

iOS Deployment Target
맨 처음 info에서 살펴본 iOS Deployment Target과 같습니다.
info의 버전값을 바꿔주면 이 값도 변경되는 것을 확인했습니다.
새 API를 호출하기 전에 코드가 null 함수 포인터나 특정 시스템 버전을 확인해야합니다.

Packaging

모듈 및 익스텐션, 그리고 plist에 관한 내용을 담고있습니다.

Info.plist File
번들에 사용되는 info.plist 정보가 들어 있는 속성 목록 파일의 프로젝트 상대 경로입니다.

Product Name
Target에서 생성한 Product의 기본 이름입니다.

Search Paths

경로를 찾는것과 관련된 항목으로 보입니다.
프레임워크, 라이브러리 등의 경로를 찾고 외부라이브러리를 사용할 때 사용합니다.

Always Search User Paths
이 설정은 Xcode 8.3에서 더이상 사용되지 않고, 이후 버전에서는 지원되지 않을수 있다고합니다.
활성화된 경우 '#include <header.h>'와 같은 스타일을 사용하는걸로 보입니다.
사용하지 않도록 설정하는 것을 권장하고 있습니다.

Apple Clang - Code Generation

Clang은 C, C++, Objective-C, Object-C++ 프로그래밍 언어를 위한 컴파일러 프론트엔드입니다.
LLVM을 백엔드로 사용하며 LLVM 2.6 이후로 릴리즈의 일부로 자리잡았고, 목표는 GNU 컴파일러 모음을 대체하는 것 입니다.

Generate Position-Dependent Code
더 빠른 기능에는 애플리케이션이 필요합니다.
독립적인 위치여야 하는 공유 라이브러리에는 적합하지 않습니다.

No Common Blocks
C에서 초기화되지 않은 전역변수도 공통 블럭으로 생성하는 대신 개체 파일의 데이터 섹션에 할당합니다.
이는 두개의 다른 컴파일에서 동일한 변수가 선언되면 해당 변수를 연결할 때 오류가 발생하는것에 대해 영향을 미칩니다.

Optimization Level
생성된 코드가 속도 및 이진 크기에 최적화 되는 정도를 지정합니다.
[None] - 최적화 X
O0 부터 Os 단계로 갈수록 빠르고 크기가 작은 최적화를 수행합니다.

Apple Clang - Language

C Language Dialect
표준 or 비표준 C언어 dialect을 고릅니다.

  • ANSI C : 호환되지 않은 GNU 확장 기능을 해제하여 ISO C90 및 ISO C++을 수락합니다
  • C89 : ISO C90을 수락하지만 GNU 확장 기능은 수락하지 않습니다
  • GNU89 : ISO C90 및 GNU 확장을 허용합니다.
  • C99 : ISO C99를 수락하지만 GNU 확장기능은 수락하지 않습니다.
  • GNU99 : ISO C99 및 GNU 확장을 허용합니다.
  • C11 : ISO C11 을 수락하지만 GNU 확장기능은 수락하지 않습니다.
  • GNU11 : ISO C11 및 GNU 확장을 허용합니다.
  • Compiler Default : 컴파일러가 기본 C언어 dialect를 사용하도록 지시합니다. 일반적으로 특정 요구 사항이 없는 한 이 방법이 가장 좋습니다. (현재 GNU99와 동일)

Apple Clang - Language - C++

C++ Language Dialect
표준 or 비표준 C++ 언어 dialect를 고릅니다.

  • C++98 : ISO C++ 1998을 수정과 함께 허용하지만 GNU 확장자는 허용 X
  • GNU++98 : ISO C++ 1998 및 GNU 확장자 허용
  • C++11 : ISO C++ 2011 표준을 허용하지만, GNU 확장자는 허용 X
  • GNU++ 11 : C++ 2011 표준 및 GNU 확장자 허용
  • C++ 14 : C++ 2014 표준을 허용하지만 GNU 확장자 허용 X
  • GNU++ 14 : C++ 2014 표준 및 GNU 확장자 허용
  • C++ 17 : C++ 2017 표준을 허용하지만 GNU 확장자 허용 X
  • GNU++ 17 : C++ 2017 표준 및 GNU 확장자 허용
    *Compiler Default : 컴파일러가 기본 C++ 언어 Dialect를 사용하도록 지시합니다. 일반적으로 특정 요구사항이 없는 한 이 방법이 가장 좋습니다 (현재 GNU98++ 과 동일)

C++ Standard Library
사용할 C++ 표준 라이브러리의 버전을 선택합니다.

  • libstdc++ : GCC 및 Clang(기본 값) 과 함께 작동하는 기존 C++ 표준 라이브러리
  • libc++ : 매우 최적화된 C++ 표준 라이브러리로, Clang에서만 작동하며 새로운 C++11 기능을 지원하도록 설계됨

Apple Clang - Language - Modules

Clang에 모듈과의 관련된 설정입니다.

Enable Modules
시스템 API에 모듈을 사용할 수 있습니다.
시스템 헤더를 원시헤더 대신 의미 모듈로 가져옵니다.
이로 인해 빌드 및 프로젝트 인덱싱 속도가 빨라질 수 있습니다.

Apple Clang - Language - Objective-C

Object-C언어와 관련된 설정입니다.

Objective-C Automatic Reference Counting
가비지 컬렉션이 활성화되지 않은 경우 참조 카운트를 자동으로 사용하도록 참조 카운트 Object-C 코드를 컴파일합니다.

Weak References in Manual Retain Release
Objective-C 코드를 컴파일하여 MRR 기법으로 컴파일된 코드에 대한 약한 참조를 활성화 합니다.

MRR : 적절히 Retain과 Release 함수로 레퍼런스 카운트를 관리해주는 메모리 관리 기법

Apple Clang - Preprocessing

전처리와 관련된 설정입니다.

Enable Foundation Assertions
NSAsset에서 제공하는 assertion logic이 사전 처리된 소스코드에 포함되는지, 아니면 전처리 중에 제거되는지 여부를 제어합니다.
assertion을 사용하지 않도록 설정하면 코드 성능이 향상될 수 있습니다.

assertion : 프로그램의 특정 지점에 위치한 어써션은 해당 지점에서 개발자가 반드시 참이어야 한다고 생각하는 사항을 표현한 논리식

Enable Strict Checking of objc_msgSend Calls
호출하기전, 적절한 함수 포인터 유형에 'objc_msgSend' 호출을 캐스팅해야 하는지의 여부를 제어합니다.

objc_msgSend : Objective-C의 함수

Preprocessor Macros
foo 또는 foo=bar 형식의 전처리기 매크로의 공백으로 구분된 목록입니다.

Apple Clang - Warnings - All Langeages

경고와 관련된 항목입니다.

Block Capture of Autoreleasing
암시적으로 자동 릴리즈 매개변수의 Block Capture에 대해 경고합니다.

Documentation Comments
누락된 태그 또는 잘못된 태그와 같은 문서 주석의 문제에 대해 경고합니다.

Empty Loop Bodies
의심스러운 빈 Loop문에 대해 경고합니다.

Impicit Boolean Conversions
의심스러운 Bool 값에 대한 암시적 변환에 대해 경고합니다.
ex) 함수 이름이 foo 인경우 "if foo" 구문을 쓰면 경고가 발생합니다

implicit Constant Conversions
의미에 따라 상수 값이 변경되도록하는 상수 값의 암시적 변환에 대해 경고합니다.

Implicit Conversion to 32 Bit Type
값이 64비트 유형에서 32비트 유형으로 암시적으로 변환되면 경고합니다.

Implicit Enum Conversions
여러 종류의 열거형 값 간의 암시적 변환에 대해 경고합니다.

Implicit Integer to Pointer Conversions
포인터와 정수 간의 암시적 변환에 대해 경고합니다.
ex) NSNumber와 정수를 사용하여 잘못 혼합된 경우

Implicit Non-Literal Null Conversions
0으로 보이는 비문자 식이 null 포인터로 처리되는 것에 대해 경고합니다.

Infinite Recursion
함수를 통과하는 모든 경로가 자기자신을 호출할 경우 경고합니다.

Mismatched Return Type
정의된 반환유형('void' 아님)이 반환 값 없이 반환문을 포함하거나, 반환문을 포함하지 않았을때 경고가 발생합니다.
또한 void return 타입의 함수가 값을 반환하려고 할 때 경고가 발생합니다.

Quoted Include In Framework Header
프레임워크 헤더에 포함된 프레임워크 스타일 대신 따옴표로 묶인 포함이 사용될 때 경고합니다.

Strict Prototypes
프로토타입이 아닌 선언에 대해 경고합니다.

Suspicious Commas
쉼표 연산자의 의심스러운 사용에 대해 경고합니다.

Unguraded availability
배포 대상보다 최신 API가 "if (@available(..))" 없이 사용될 경우 경고합니다.

Uninitialized Variables
변수가 'setjmp' 호출에 의해 폐쇄될 수 있는지 또는 사전 초기화 없이 자동 변수를 사용하는지에 경고합니다.
컴파일러는 자동 변수가 초기화되는 모든 경우 또는 초기화 전에 사용할 수 있는 모든 사용패턴은 감지하지 못할 수 있습니다.
초기화되지 않은 일반적인 값 검사 또는 보다 공격적인(보수적인) 검사 간에 전환할 수 있으며, 이는 더 많은 문제를 찾지만 검사가 훨씬 엄격합니다.

Unreachable Code
연결할 수 없는 코드에 경고합니다.

Unused Functions
정적함수가 선언되었지만 정의되지 않았거나 인라인이 아닌 정적함수가 사용되지 않을 때 마다 경고합니다.

Unused Variables
선언 외에 로컬 변수 또는 일정하지 않은 정적 변수를 사용하지 않을 때마다 경고합니다.

Apple Clang - Warings - C++

C++ 언어와 관련된 경고입니다.

Range-based For Loops
루프의 범위 기반에 대해 경고합니다.

Suspicious Moves
'std::move'의 의심스러운 사용에 대해 경고합니다.

Static Analyzer - Generic Issues

일반적인 이슈에 대해 분석합니다.

Misuse of 'nonnull'
'nonnull' 파라미터 및 반환 유형이 잘못 사용되는지 점검합니다.

Static Analyer - Issues - Apple APIs

Suspicious Conversions of NSNumber and CFNumberRef
NSnumber, CFNumberRef, OSNumber 또는 OSBoolean과 같은 숫자 개체를 다른 개체 대신 원시 값으로 비교하거나 변환하면 경고합니다.

Swift Compiler - Code Generation

Compilation Mode
Swift 파일이 재구성되는 방식을 제어합니다

  • Incremental : 최신이 아닌 모듈에서만 Swift 소스 파일을 재구성하여 필요에 따라 여러 컴파일러 프로세스를 실행합니다.
  • Whole Module : 모듈의 모든 Swift 소스 파일을 단일 컴파일러 프로세스에서 항상 재구성합니다.

Optimization Level
생성된 코드가 속도 및 이진 크기에 최적화 되는 정도를 지정합니다.

  • [None] : 최적화 없이 컴파일
  • [-O] : 속도에 맞게 최적화
  • [-Osize] : 크기에 맞게 최적화
  • [-O -whole-module-optimization] : 전체 모듈 최적화

Swift Compiler - Custom Flag

Active Compilation Conditions
조건부 컴파일 식에 사용할 수 있는 컴파일 조건 목록입니다.

Swift Compiler - Language

Swift Language Version
스위프트 언어의 버전을 지정해 줄 수 있습니다.

스압이 심해 info.plist는 이어서 다음장에서 알아봅시다.

profile
안녕하세요 95년생 김민석입니다

1개의 댓글

comment-user-thumbnail
2024년 6월 15일

감사합니다...!

답글 달기