목록분류 전체보기 (23)
문제가 되는 코드guard let navigationBar = navigationController?.navigationBar else { return }navigationBar.addSubview(navigationProgressView)navigationProgressView.snp.makeConstraints { let margins = navigationBar.layoutMarginsGuide $0.leading.equalTo(margins).offset(60) $0.trailing.equalTo(margins).offset(-75) $0.centerY.equalToSuperview() $0.height.equalTo(8)}✔ 왜 이런 현상이 생길까?Navigation Bar는 push ..
왜 Sandbox 라고 부를까?애플의 경우 기술 개념을 추항화 할때 보통 고유 명사로 설명하는 방식을 선호하는 것 같다.App SandBox 역시 sandbox (n.) = 모래상자, 모래밭모래 상자안에서만 놀수 있다는 물리적인 비유로 그 밖의 공간에는 손댈수 없다는 은유적인 표현이다.앱(macOS, iOS .. 등등)이 시스템 리소스에 제한된 범위 내에서만 작동하여 시스템 훼손을 원천 차단해버린다.Sandbox 구조눈으로 보는게 아무래도 더 기억에 남기때문에 직접 파악해보자아무 앱을 시뮬레이터로 빌드 시켜본 후시뮬레이터는 Xcode에서 Widnow/Devices and Simulators 에서 Identifier를 확인할 수 있다.~/Library/Developer/CoreSimulator/Device..
HTTP 목적웹 상의 리소스(문서, 이미지, JSON 등)의 표현(representation)을 표준화된 요청/응답 방식으로 서로 주고받게 만드는 것어떤 클라이언트(브라우저·앱)와 어떤 서버라도 상호운용되도록, 확장 가능하고, 캐시 가능한 방식으로 통신을 규정합니다.전반적인 운영HTTP 프로토콜은 요청/응답 패러다임을 기반으로 한다.클라이언트는 서버와의 연결을 설정하고 요청 메서드, URI 및 프로토콜 버전 형식으로 서버에 요청을 보낸 다음 요청 수정자, 클라이언트 정보 및 가능한 본문 내용이 포함된 MIME 형식 메시지를 보냅니다.서버는 메시지의 프로토콜 버전과 성공 또는 오류 코드를 포함하는 상태 줄과 서버 정보, 엔티티 메타 정보 및 ㄷ가능한 본문 내용을 포함하는 MIME 형식의 메시지가 표시됩니다..
배경 과 문제 정의현재 진행중인 알쏭달쏭 프로젝트에서는 Tuist같은 모듈을 관리해주는 도구를 사용하지 않고, Xcode에서 지원해주는 Workspace를 사용하여 Projects 그룹화하여 관리한다.Tuist를 사용하기에는 짧은 기간 내에 개발을 완벽하게 이해하고있는 상황이 아니였기 때문에 Workspace로 결정하여 개발을하게 되었다.결합도를 줄이기 위해서 큰 기능에 따라 뷰와 데이터, 네트워크를 하는 모듈을 분리하여 작업을 진행하였는데메인 앱에 통합시키는 과정에서 시뮬레이터에서는 빌드가 잘 되었지만, 앱을 배포했을 때 크래시가 발생하는 문제가 발생하였다.해결 과정문제는 dyld 이슈인 것으로 추정된다.dyld란 Dynamic loader/linker 로 앱이 실행될 때 필요한 동적 라이브러리를 찾아..
전체 빌드 타이밍 출력xcodebuild \ -workspace "App명".xcworkspace \ -scheme "Scheme명" \ -configuration "Debug/Release중 선택" \ -destination 'generic/platform=iOS' \ build \ -showBuildTimingSummary포메팅 해서 보는 방법TIMEFORMAT=$'\n⏱ Total build time: %3R seconds'time xcodebuild \ -workspace "App명".xcworkspace \ -scheme "Scheme명" \ -configuration Debug \ -destination 'generic/platform=iOS' \ build > /dev/..
악의적인 코드로부터 앱을 보호하기 위해 Apple은 거의 모든 기기의 샌드박스에 앱을 배치합니다.각 샌드박스에는 해당 앱만 접근할 수 있는 컨테이너 디렉터리가 있습니다.생성한 두 앱 간 또는 앱과 앱 익스텐션 간에 파일 공유하기 위해서 두 프로세스 모두에 앱 그룹을 구성해야합니다.적절한 권한이 있는 프로세스는 앱 그룹 디렉터리의 URL을 요청하고, 해당 디렉터리의 파일에 접근할 수 있습니다. 앱 그룹을 생성하면 여러 프로세스가 파일을 공유할 수 있는 디스크 공유 공간이 생성됩니다.또한 Mach IPC, POSIX 세마포어 및 공유 메모리, UNIX 도메인 소켓, 기타 IPC 메커니즘을 사용하여 프로세스 간의 추가정인 프로세스 간 통신(IPC) 이 가능합니다. 즉, 직접 메모리 공유는 불가하고, App G..
다양한 범주의 병행성 문제 해결을 위해서는 락과 조건 변수가 모두 필요하다. Edsger Dijkstra는 세마포어 라는 다양한 동기화 관련 문제를 해결하는 기법을 탄생하였다. 세마포어는 락과 컨디션 변수로 모두 사용할 수 있다.세마포어 사용법세마포어는 정수 값을 갖는 객체로서 두 개의 루틴으로 조작할 수 있다.sem_wait() / sem_post() 이다.세마포어는 초기값에 의해 동작이 결정되기 때문에 값을 초기화 해야한다.#include 세마포어 s를 선언 후, 3번째 인자로 1을 전달하여 세마포어의 값을 1로 초기화sem_init()의 두번 째 인자는 0이다. → 같은 프로세스 내의 쓰레드 간에 세마포어를 공유한다는 뜻두번 째 인자에 다른 값을 넣어서 다른 프로세스 간에 동기화또한 제공 가능초기화..
쓰레드가 계속 진행하기 전에 어떤 조건이 참인지를 검사해야 하는 경우가 많이 있다. 예를 들어 부모 쓰레드가 작을 시작하기 전에 자식 쓰레드가 작업을 끝냈는지를 검사하기를 원할 수 있다(이 과정을 보통 join()이라 부른다). 그런 대기문은 어떻게 구현해야 할까?volatile int done = 0;void *child(void *arg) { printf("child\\n"); done = 1; return NULL;}int main(int argc, char *argv[]) { printf("parent: begin\\n"); pthread_t c; Pthread_create(&c, NULL, child, NULL); // 자식 생성 while (done == 0 ); // Spin printf("..