{"@attributes":{"version":"2.0"},"channel":{"title":"Skyline-23\uc758 iOS\ub178\ud2b8","link":"https:\/\/ios-dev-skyline-23.tistory.com\/","description":"iOS \uc8fc\ub2c8\uc5b4 \uac1c\ubc1c\uc790\uc758 \ube44\ubc00\ub178\ud2b8","language":"ko","pubDate":"Sun, 19 Apr 2026 10:33:27 +0900","generator":"TISTORY","ttl":"100","managingEditor":"Skyline-23","image":{"title":"Skyline-23\uc758 iOS\ub178\ud2b8","url":"https:\/\/tistory1.daumcdn.net\/tistory\/4590609\/attach\/8f115a112a134508814307ba5864d685","link":"https:\/\/ios-dev-skyline-23.tistory.com"},"item":[{"title":"macOS \uc571\uc5d0 Python \ub7f0\ud0c0\uc784\uacfc pip \ud328\ud0a4\uc9c0 \uc644\uc804\ud788 \ub0b4\uc7a5\ud558\uae30","link":"https:\/\/ios-dev-skyline-23.tistory.com\/31","description":"<p><figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-filename=\"\ube14\ub85c\uadf8 \ud45c\uc9c0.001.png\" data-origin-width=\"1920\" data-origin-height=\"1080\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/KS5X9\/btsQNaL4EYg\/lLyUVBdUJuYCQ7p9emMPOk\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/KS5X9\/btsQNaL4EYg\/lLyUVBdUJuYCQ7p9emMPOk\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/KS5X9\/btsQNaL4EYg\/lLyUVBdUJuYCQ7p9emMPOk\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKS5X9%2FbtsQNaL4EYg%2FlLyUVBdUJuYCQ7p9emMPOk%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"1920\" height=\"1080\" data-filename=\"\ube14\ub85c\uadf8 \ud45c\uc9c0.001.png\" data-origin-width=\"1920\" data-origin-height=\"1080\"\/><\/span><\/figure>\n<\/p>\n<p data-ke-size=\"size16\">\uc548\ub155\ud558\uc138\uc694. \ud558\ub298\uc120\uc785\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">\ube14\ub85c\uadf8\ub85c\ub294 \uaf64 \uc624\ub79c\ub9cc\uc5d0 \uc778\uc0ac\ub4dc\ub9ac\ub294 \uac83 \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">\uc624\ub298\uc740 \ub3c5\ub9bd\ub41c Mac\uc571\uc5d0\uc11c python \ubc0f pip \ud328\ud0a4\uc9c0\ub97c \ubc88\ub4e4\ub9c1 \ud558\ub294 \ubc95\uc5d0 \ub300\ud574 \uae30\ub85d\uc744 \ub0a8\uaca8\ubcf4\uace0\uc790 \ud569\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">\uc6d0\ub798\ub294 iOS\ub3c4 \uac19\uc774 \uc900\ube44\ud558\ub824\uace0 \ud588\uc73c\ub098 \uae00\uc774 \uae38\uc5b4\uc9c0\uace0 \ubcf5\uc7a1\ud574\uc9c8 \uc6b0\ub824\ub3c4 \uc788\uace0, \uc81c\uac00 \uc870\uae08 \ub354 \uac80\uc99d\ud558\uace0 \uac19\uc774 \uc804\ub2ec\ub4dc\ub9ac\uace0 \uc2f6\uc5b4\uc11c macOS\uc6a9\uc73c\ub85c \uae00\uc744 \uba3c\uc800 \uc4f0\uac8c \ub418\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">\uba3c\uc800 \uc774 \uae00\uc740 \ub2e4\uc218\uc758 \ub3c4\uc804\uc801\uc778 \uc2e4\ud5d8\uc744 \ubc14\ud0d5\uc73c\ub85c \ub0a8\uae34 \ub0b4\uc6a9\uc774\uba70, \uc798\ubabb\ub41c \ud3ec\ud568\ub418\uc5b4 \uc788\uc744 \uc218 \uc788\ub2e4\ub294 \ub9d0\uc744 \ubbf8\ub9ac \ub0a8\uae30\uace0 \uc2f6\uc2b5\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">\uc758\uacac\uc744 \ub313\uae00\ub85c \ub2ec\uc544\uc8fc\uc2dc\uba74 \uc88b\uaca0\uc2b5\ub2c8\ub2e4 :)<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h3 data-ke-size=\"size23\">0. \uc774 \ubc29\ubc95\uc744 \ucc3e\uac8c \ub41c \uacc4\uae30<\/h3>\n<p data-ke-size=\"size16\">\uba3c\uc800 \uc774 \ubc29\ubc95\uc744 \ucc3e\uac8c \ub41c \uacc4\uae30\ubd80\ud130 \uc124\uba85\uc744 \ub4dc\ub9ac\uace0 \uc2f6\uc740\ub370,<\/p>\n<p data-ke-size=\"size16\">\uc774\ub294 \ud504\ub85c\uc81d\ud2b8 Applepie-RPC\ub97c \ub9cc\ub4e4\uae30 \uc704\ud568\uc774\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">\uc774 \ud504\ub85c\uc81d\ud2b8\ub294 \uc544\ub798 \uc0ac\uc9c4\uacfc \uac19\uc774 \ub514\uc2a4\ucf54\ub4dc\uc5d0 \uc560\ud50c\ubba4\uc9c1\uc758 \ud604\uc7ac \uc74c\uc545 \ub4e3\ub294 \uc911 \uc0c1\ud0dc\ub97c \ub744\uc6cc\uc8fc\ub294 \ud504\ub85c\uc81d\ud2b8\uc785\ub2c8\ub2e4.<\/p>\n<p><figure class=\"imageblock floatLeft\" data-ke-mobileStyle=\"widthOrigin\" data-filename=\"Screenshot 2025-08-23 at 5.54.35\u202fPM.png\" data-origin-width=\"600\" data-origin-height=\"1042\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/QbXNU\/btsP4bYhAxE\/0dTdfKdbv8sgj3yefpHniK\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/QbXNU\/btsP4bYhAxE\/0dTdfKdbv8sgj3yefpHniK\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/QbXNU\/btsP4bYhAxE\/0dTdfKdbv8sgj3yefpHniK\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQbXNU%2FbtsP4bYhAxE%2F0dTdfKdbv8sgj3yefpHniK%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"300\" height=\"1042\" data-filename=\"Screenshot 2025-08-23 at 5.54.35\u202fPM.png\" data-origin-width=\"600\" data-origin-height=\"1042\"\/><\/span><\/figure>\n<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">\ubb3c\ub860, \uae30\uc874\uc5d0\ub3c4 \uc560\ud50c\ubba4\uc9c1\uc758 \uc0c1\ud0dc\ub97c \ub514\uc2a4\ucf54\ub4dc\uc5d0 \ub744\uc6cc\uc8fc\ub294 \ud504\ub85c\uadf8\ub7a8\uc740<\/p>\n<p data-ke-size=\"size16\">\uc5ec\ub7ff \uc874\uc7ac\ud588\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">\uadf8\ub7fc \uc774 \ud504\ub85c\uc81d\ud2b8\uc758 \ucc28\ubcc4\uc810 \ub610\ud55c \uc124\uba85\ub4dc\ub824\uc57c\uaca0\uc8e0.<\/p>\n<p data-ke-size=\"size16\">\uc774 \ud504\ub85c\uc81d\ud2b8\ub294 <b>\ubb34\ub824<\/b> \uac19\uc740 \ub124\ud2b8\uc6cc\ud06c\uc0c1\uc758 \ud648\ud31f, \uc560\ud50c\ud2f0\ube44\ub97c \uc870\ud68c\ud558\uc5ec \uadf8 \uc74c\uc545 \uc815\ubcf4\uae4c\uc9c0<\/p>\n<p data-ke-size=\"size16\">\ub514\uc2a4\ucf54\ub4dc\uc5d0 \ub744\uc6cc\uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">\uc774 \ubc29\uc2dd\uc740 \uc804 \uc138\uacc4 \ucd5c\ucd08\uc774\uba70, \uc544\uc9c1 \uad6c\ud604\ud55c \uc0ac\ub78c\uc774 \uc5c6\uc5c8\uae30\uc5d0 \uc9c1\uc811 \uc4f0\uace0 \uc2f6\uc5b4\uc11c \ub9cc\ub4e4\uac8c \ub418\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p><figure class=\"imageblock floatLeft\" data-ke-mobileStyle=\"widthOrigin\" data-origin-width=\"486\" data-origin-height=\"508\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/yol5P\/btsP4h5em2N\/UG48H6KtsZ8p43kqajPkH1\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/yol5P\/btsP4h5em2N\/UG48H6KtsZ8p43kqajPkH1\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/yol5P\/btsP4h5em2N\/UG48H6KtsZ8p43kqajPkH1\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fyol5P%2FbtsP4h5em2N%2FUG48H6KtsZ8p43kqajPkH1%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"300\" height=\"314\" data-origin-width=\"486\" data-origin-height=\"508\"\/><\/span><\/figure>\n<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">\uc774\ub7f0\uc2dd\uc73c\ub85c \ub514\ubc14\uc774\uc2a4\ub97c \uc120\ud0dd\ud574\uc11c \uc120\ud0dd\ub41c \ub514\ubc14\uc774\uc2a4\uc5d0 \ub300\ud55c \uc815\ubcf4\uac12\uc744 \uac00\uc838\uc624\uace0,<\/p>\n<p data-ke-size=\"size16\">\uadf8 \uc815\ubcf4\ub97c \ubc14\ud0d5\uc73c\ub85c \ub514\uc2a4\ucf54\ub4dc api\ub97c \ud638\ucd9c\ud558\uc5ec \uc815\ubcf4\ub97c \uc5c5\ub370\uc774\ud2b8 \ud569\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">\ud558\uc9c0\ub9cc \uc774 \ud504\ub85c\uc81d\ud2b8\ub97c \uc9c4\ud589\ud558\uba74\uc11c \uc5ec\ub7ec \uc5b4\ub824\uc6c0\uc744 \uacaa\uac8c \ub429\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size18\">1. \uc560\ud50c\ud2f0\ube44\ub098 \ud648\ud31f\uc758 \uc815\ubcf4\ub97c \uac00\uc838\uc62c Swift \ub77c\uc774\ube0c\ub7ec\ub9ac\uc758 \ubd80\uc7ac<\/p>\n<p data-ke-size=\"size18\">2. \ub514\uc2a4\ucf54\ub4dc\uc5d0 \uc815\ubcf4\ub97c \uc81c\uacf5\ud558\uae30 \uc704\ud574 \uc0ac\uc6a9\ud560 \"Discord rich presense\"\uc758 swift \ub77c\uc774\ube0c\ub7ec\ub9ac\uc758 \ubc29\uce58<\/p>\n<p data-ke-size=\"size18\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">1\ubc88\uc758 \uacbd\uc6b0 python\uc740 pyatv\ub77c\ub294 python \ud328\ud0a4\uc9c0\uac00 \uc874\uc7ac\ud558\ub098, Swift\uc5d0\uc11c \uc0ac\uc6a9\ud558\uae30 \uc704\ud574\uc11c\ub294 \ud648\ud31f\uc758 \uc5f0\uacb0 \ud578\ub4dc\uc250\uc774\ud0b9\ubd80\ud130 \uc218\ub9ce\uc740 \uc591\uc758 \ud504\ub85c\ud1a0\ucf5c\uc744 \uc900\uc218\ud55c \uc5f0\uacb0\ubd80\uc640 \uc778\uc99d\uacfc\uc815\uc744 \uad6c\ud604\ud574\uc57c \ud588\uc2b5\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\"><a href=\"https:\/\/github.com\/postlund\/pyatv\" target=\"_blank\" rel=\"noopener&nbsp;noreferrer\">https:\/\/github.com\/postlund\/pyatv<\/a><\/p>\n<figure id=\"og_1755942183355\" contenteditable=\"false\" data-ke-type=\"opengraph\" data-ke-align=\"alignCenter\" data-og-type=\"object\" data-og-title=\"GitHub - postlund\/pyatv: A client library for Apple TV and AirPlay devices\" data-og-description=\"A client library for Apple TV and AirPlay devices. Contribute to postlund\/pyatv development by creating an account on GitHub.\" data-og-host=\"github.com\" data-og-source-url=\"https:\/\/github.com\/postlund\/pyatv\" data-og-url=\"https:\/\/github.com\/postlund\/pyatv\" data-og-image=\"https:\/\/scrap.kakaocdn.net\/dn\/b2oWe1\/hyZC0yHY3t\/lyWXvShPSLHPPIC7rkf0F1\/img.png?width=1200&amp;height=600&amp;face=1001_90_1066_161,https:\/\/scrap.kakaocdn.net\/dn\/bBkyt5\/hyZzIF40ZS\/GQDdNR7YFk4BNPMJaQCCX0\/img.png?width=1200&amp;height=600&amp;face=1001_90_1066_161\"><a href=\"https:\/\/github.com\/postlund\/pyatv\" target=\"_blank\" rel=\"noopener\" data-source-url=\"https:\/\/github.com\/postlund\/pyatv\">\n<div class=\"og-image\" style=\"background-image: url('https:\/\/scrap.kakaocdn.net\/dn\/b2oWe1\/hyZC0yHY3t\/lyWXvShPSLHPPIC7rkf0F1\/img.png?width=1200&amp;height=600&amp;face=1001_90_1066_161,https:\/\/scrap.kakaocdn.net\/dn\/bBkyt5\/hyZzIF40ZS\/GQDdNR7YFk4BNPMJaQCCX0\/img.png?width=1200&amp;height=600&amp;face=1001_90_1066_161');\">&nbsp;<\/div>\n<div class=\"og-text\">\n<p class=\"og-title\" data-ke-size=\"size16\">GitHub - postlund\/pyatv: A client library for Apple TV and AirPlay devices<\/p>\n<p class=\"og-desc\" data-ke-size=\"size16\">A client library for Apple TV and AirPlay devices. Contribute to postlund\/pyatv development by creating an account on GitHub.<\/p>\n<p class=\"og-host\" data-ke-size=\"size16\">github.com<\/p>\n<\/div>\n<\/a><\/figure>\n<p data-ke-size=\"size16\">\uc774 \ub808\ud3ec\uc9c0\ud1a0\ub9ac\uc5d0\uc11c \uc54c \uc218 \uc788\ub4ef \uc774\ub294 \ub9ce\uc740 \uc591\uc758 \ucf54\ub4dc\ub97c \ub2e4\uc2dc \uc368\uc57c\ud558\uace0, \ub9cc\ub4e0\ub2e4\uace0 \ud574\uc11c \uc5c5\ub370\uc774\ud2b8 \uc2dc \uc720\uc9c0\ubcf4\uc218\uac00 \uac00\ub2a5\ud558\ub2e4\uace0 \uc0dd\uac01\ud558\uc9c0 \uc54a\uc558\uae30\uc5d0 Swift\uc6a9 \ub808\ud3ec\ub97c \ub530\ub85c \ud30c\ub294 \uac83\uc740 \ubd88\uac00\ub2a5 \ud558\ub2e4\uace0 \uc0dd\uac01\ud588\uc2b5\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">2\ubc88\ub3c4 \ubb38\uc81c\uc600\ub294\ub370, python\uae30\ubc18 discord rich presense\ub294 \uc544\uc9c1 \uc5c5\ub370\uc774\ud2b8 \ub418\uae34 \ud558\uc9c0\ub9cc, Swift\uc6a9\uc758 discord rich presense\ub294 \uc774\ubbf8 \uc544\uce74\uc774\ube0c\uac00 \ub41c \ud6c4\uc600\uace0, \uc5c5\ub370\uc774\ud2b8\uac00 \ub04a\uae34 \uc9c0 \uc624\ub798 \ub418\uc5c8\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\"><a href=\"https:\/\/github.com\/Azoy\/SwordRPC\" target=\"_blank\" rel=\"noopener&nbsp;noreferrer\">https:\/\/github.com\/Azoy\/SwordRPC<\/a><\/p>\n<figure id=\"og_1755942318994\" contenteditable=\"false\" data-ke-type=\"opengraph\" data-ke-align=\"alignCenter\" data-og-type=\"object\" data-og-title=\"GitHub - Azoy\/SwordRPC: A Discord Rich Presence Library for Swift\" data-og-description=\"A Discord Rich Presence Library for Swift. Contribute to Azoy\/SwordRPC development by creating an account on GitHub.\" data-og-host=\"github.com\" data-og-source-url=\"https:\/\/github.com\/Azoy\/SwordRPC\" data-og-url=\"https:\/\/github.com\/Azoy\/SwordRPC\" data-og-image=\"https:\/\/scrap.kakaocdn.net\/dn\/b3gkLG\/hyZC0epsi0\/y8WuG6dF4vc7OqM4tMjOu1\/img.png?width=1200&amp;height=600&amp;face=0_0_1200_600,https:\/\/scrap.kakaocdn.net\/dn\/bfH8vT\/hyZzEjonw5\/7mi3BAazWKVKErnd3ZTIHk\/img.png?width=1200&amp;height=600&amp;face=0_0_1200_600\"><a href=\"https:\/\/github.com\/Azoy\/SwordRPC\" target=\"_blank\" rel=\"noopener\" data-source-url=\"https:\/\/github.com\/Azoy\/SwordRPC\">\n<div class=\"og-image\" style=\"background-image: url('https:\/\/scrap.kakaocdn.net\/dn\/b3gkLG\/hyZC0epsi0\/y8WuG6dF4vc7OqM4tMjOu1\/img.png?width=1200&amp;height=600&amp;face=0_0_1200_600,https:\/\/scrap.kakaocdn.net\/dn\/bfH8vT\/hyZzEjonw5\/7mi3BAazWKVKErnd3ZTIHk\/img.png?width=1200&amp;height=600&amp;face=0_0_1200_600');\">&nbsp;<\/div>\n<div class=\"og-text\">\n<p class=\"og-title\" data-ke-size=\"size16\">GitHub - Azoy\/SwordRPC: A Discord Rich Presence Library for Swift<\/p>\n<p class=\"og-desc\" data-ke-size=\"size16\">A Discord Rich Presence Library for Swift. Contribute to Azoy\/SwordRPC development by creating an account on GitHub.<\/p>\n<p class=\"og-host\" data-ke-size=\"size16\">github.com<\/p>\n<\/div>\n<\/a><\/figure>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">\uc5ec\uae30\uc11c \uc800\ub294 \uc774 \ub450 \uac00\uc9c0 \ubb38\uc81c\uc810\uc744 \ud55c\ubc88\uc5d0 \ud574\uacb0\ud558\uae30 \uc704\ud574\uc11c Swift\uc5d0\uc11c \ud30c\uc774\uc36c\uc744 \ub124\uc774\ud2f0\ube0c\ub85c \uc4f0\ub294 \uac83\uc774 \uac00\uc7a5 \uc88b\uc740 \ud574\uacb0 \ubc29\uc2dd\uc774\ub77c \uc0dd\uac01\ud588\uace0,<\/p>\n<p data-ke-size=\"size16\">\uc774\ub97c \uad6c\ud604\ud558\uae30 \uc704\ud574 \uc5ec\ub7ec\uac00\uc9c0 \uc790\ub8cc\ub97c \ucc3e\uc544\ubcf4\uc558\uc2b5\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">\uc77c\ub2e8 \ud30c\uc774\uc36c\uc744 Swift\uc5d0\uc11c \uc0ac\uc6a9\ud558\uae30 \uc704\ud574\uc11c\ub294 \ub300\ud45c\uc801\uc73c\ub85c PythonKit\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294\ub370, \uc774\ub294 \ud30c\uc774\uc36c\uc744 \ubd88\ub7ec\uc640\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\uac8c \ud574\uc8fc\ub294 \ube0c\ub9bf\uc9d5 \ud0b7\uc77c \ubfd0\uc774\uc9c0 \ud30c\uc774\uc36c \ub7f0\ud0c0\uc784\uc774 \ub0b4\uc7a5\ub418\uc5b4 \uc788\uc9c4 \uc54a\uc2b5\ub2c8\ub2e4.<br \/>\uadf8\ub807\uae30\uc5d0 iOS \uac19\uc740 \ud30c\uc774\uc36c \ub7f0\ud0c0\uc784\uc774 \ub0b4\uc7a5\ub418\uc5b4 \uc788\uc9c0 \uc54a\uc740 \uacbd\uc6b0 \uc5d0\ub7ec\uac00 \ub0a0 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h3 data-ke-size=\"size23\">1. \ud30c\uc774\uc36c \ub7f0\ud0c0\uc784\uc744 Swift \uc571\uc5d0 \ub0b4\uc7a5 \uc2dc\ud0a4\uae30<\/h3>\n<p data-ke-size=\"size16\">\uc989 \uadf8\ub807\ub2e4\ub294 \uc774\uc57c\uae30\ub294 \ud30c\uc774\uc36c \ub7f0\ud0c0\uc784\uc744 \uac19\uc774 \ub0b4\uc7a5\uc2dc\ucf1c \uc900\ub2e4\uba74 Mac \uc5b4\ud50c\ub9ac\ucf00\uc774\uc158 \ub2e8\ub3c5, \uc2ec\uc9c0\uc5b4 \ucd94\ud6c4 \ub098\uc544\uac00 iOS \ud658\uacbd\uc5d0\uc11c\ub3c4 \uc6d0\ud65c\ud558\uac8c PyhtonKit\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4\ub294 \uc774\uc57c\uae30\uac00 \ub418\uaca0\uc8e0.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">\uadf8\ub807\uae30 \ub54c\ubb38\uc5d0 \uc800\ub294 Python \ub7f0\ud0c0\uc784\uc744 \uac19\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d \uc815\ub9ac\ud574\ub193\uc740 \ud328\ud0a4\uc9c0 \ud504\ub808\uc784\uc6cc\ud06c\uac00 \uc788\uc744 \uac83\uc774\ub77c\uace0 \uc0dd\uac01\ud558\uace0, \uac80\uc0c9 \ud6c4 \ub2e4\uc74c \uae43\ud5c8\ube0c\ub97c \ucc3e\uc744 \uc218 \uc788\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\"><a href=\"https:\/\/github.com\/beeware\/Python-Apple-support\" target=\"_blank\" rel=\"noopener&nbsp;noreferrer\">https:\/\/github.com\/beeware\/Python-Apple-support<\/a>&nbsp;<\/p>\n<figure id=\"og_1756024448750\" contenteditable=\"false\" data-ke-type=\"opengraph\" data-ke-align=\"alignCenter\" data-og-type=\"object\" data-og-title=\"GitHub - beeware\/Python-Apple-support: A meta-package for building a version of Python that can be embedded into a macOS, iOS, t\" data-og-description=\"A meta-package for building a version of Python that can be embedded into a macOS, iOS, tvOS or watchOS project. - beeware\/Python-Apple-support\" data-og-host=\"github.com\" data-og-source-url=\"https:\/\/github.com\/beeware\/Python-Apple-support\" data-og-url=\"https:\/\/github.com\/beeware\/Python-Apple-support\" data-og-image=\"https:\/\/scrap.kakaocdn.net\/dn\/bx7Oa3\/hyZCYODi83\/sjl3z7qiL2XrFqyXXzjodk\/img.png?width=1200&amp;height=600&amp;face=0_0_1200_600,https:\/\/scrap.kakaocdn.net\/dn\/My0oz\/hyZC51kPI3\/WX9kFbHrEjTNxWJFxIP4kk\/img.png?width=1200&amp;height=600&amp;face=0_0_1200_600\"><a href=\"https:\/\/github.com\/beeware\/Python-Apple-support\" target=\"_blank\" rel=\"noopener\" data-source-url=\"https:\/\/github.com\/beeware\/Python-Apple-support\">\n<div class=\"og-image\" style=\"background-image: url('https:\/\/scrap.kakaocdn.net\/dn\/bx7Oa3\/hyZCYODi83\/sjl3z7qiL2XrFqyXXzjodk\/img.png?width=1200&amp;height=600&amp;face=0_0_1200_600,https:\/\/scrap.kakaocdn.net\/dn\/My0oz\/hyZC51kPI3\/WX9kFbHrEjTNxWJFxIP4kk\/img.png?width=1200&amp;height=600&amp;face=0_0_1200_600');\">&nbsp;<\/div>\n<div class=\"og-text\">\n<p class=\"og-title\" data-ke-size=\"size16\">GitHub - beeware\/Python-Apple-support: A meta-package for building a version of Python that can be embedded into a macOS, iOS, t<\/p>\n<p class=\"og-desc\" data-ke-size=\"size16\">A meta-package for building a version of Python that can be embedded into a macOS, iOS, tvOS or watchOS project. - beeware\/Python-Apple-support<\/p>\n<p class=\"og-host\" data-ke-size=\"size16\">github.com<\/p>\n<\/div>\n<\/a><\/figure>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">\uc774 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc774\uc6a9\ud574 \ud30c\uc774\uc36c \ub7f0\ud0c0\uc784\uc744 Python.xcframework\ub85c \ub0b4\uc7a5\uc2dc\ud0a4\uace0, PythonKit\uc744 \uc0ac\uc6a9\ud558\uba74 \uc77c\ucc28\uc801\uc73c\ub85c Python\uc744 MacOS \uc571 \ub0b4\ubd80\uc5d0\uc11c \uc0ac\uc6a9\ud560 \uc900\ube44\ub294 \ub05d\ub0a9\ub2c8\ub2e4.<\/p>\n<p><figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-filename=\"Screenshot 2025-08-28 at 10.51.24\u202fPM.png\" data-origin-width=\"3866\" data-origin-height=\"584\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/bbnZxt\/btsQbBiiLoj\/kunkY0nXn3Wml7zIyWMU1K\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/bbnZxt\/btsQbBiiLoj\/kunkY0nXn3Wml7zIyWMU1K\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/bbnZxt\/btsQbBiiLoj\/kunkY0nXn3Wml7zIyWMU1K\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbnZxt%2FbtsQbBiiLoj%2FkunkY0nXn3Wml7zIyWMU1K%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"3866\" height=\"584\" data-filename=\"Screenshot 2025-08-28 at 10.51.24\u202fPM.png\" data-origin-width=\"3866\" data-origin-height=\"584\"\/><\/span><\/figure>\n<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p><figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-origin-width=\"210\" data-origin-height=\"200\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/bW97ZD\/btsQcjBrzvr\/eMiuvlkV4zxLxNba4wdsQ0\/img.webp\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/bW97ZD\/btsQcjBrzvr\/eMiuvlkV4zxLxNba4wdsQ0\/img.webp\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/bW97ZD\/btsQcjBrzvr\/eMiuvlkV4zxLxNba4wdsQ0\/img.webp\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbW97ZD%2FbtsQcjBrzvr%2FeMiuvlkV4zxLxNba4wdsQ0%2Fimg.webp\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"400\" height=\"381\" data-origin-width=\"210\" data-origin-height=\"200\"\/><\/span><\/figure>\n<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">\uc5ec\uae30\uae4c\uc9c0 \ub530\ub77c\uc624\ub294\ub370 \ud798\ub4e4\uc9c4 \uc54a\uc558\uc744 \uac83\uc774\ub77c \uc608\uc0c1\ud569\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">\ud558\uc9c0\ub9cc \uc6b0\ub9ac\ub294 \ud30c\uc774\uc36c\uc744 \uc0ac\uc6a9\ud558\uace0\uc790 \ub7f0\ud0c0\uc784\uc744 \ub0b4\uc7a5 \uc2dc\ud0a8\uac8c \uc544\ub2d9\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">\uc6b0\ub9ac\uc758 \ud669\uae08\uace0\ube14\ub9b0\uc778 \ud30c\uc774\uc36c\uc758 \uc218\ub9ce\uc740 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub4e4\uc744 \ub0b4\uc7a5\uc2dc\ud0a4\uae30 \uc704\ud574 \ub098\uc544\uac00\uace0 \uc788\ub294 \uc911\uc774\uc8e0.<\/p>\n<p data-ke-size=\"size16\">\uc5ec\uae30\uc11c \ubb38\uc81c\uc810\uc774 \ubc1c\uc0dd\ud569\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h3 data-ke-size=\"size23\">2. \ud30c\uc774\uc36c \ud504\ub808\uc784\uc6cc\ud06c\uc5d0 \ub77c\uc774\ube0c\ub7ec\ub9ac \ub0b4\uc7a5\uc2dc\ud0a4\uae30<\/h3>\n<p data-ke-size=\"size16\">\uadf8\ub7fc \uc5b4\ub5bb\uac8c \ud30c\uc774\uc36c \ubaa8\ub4c8\ub4e4\uc744 \ud504\ub808\uc784\uc6cc\ud06c\uc5d0 \ub0b4\uc7a5 \uc2dc\ud0ac \uc218 \uc788\uc744\uae4c\uc694?<\/p>\n<p data-ke-size=\"size16\">\uc5ec\uae30\uc11c \ub9ce\uc740 \uace0\ubbfc\ub4e4\uc744 \ud558\uae30 \uc2dc\uc791\ud569\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">\ud558\uc9c0\ub9cc \uacb0\ub860\uc740 \uc81c\uc77c \uac04\ub2e8\ud558\uac8c \ube4c\ub4dc \uc2dc \uc2e4\ud589\ud558\ub294 \ub2e8\uacc4, build phase\uc5d0 \ub123\uae30\ub85c \uacb0\uc815\ud588\uc2b5\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">\uba3c\uc800 python lib\uacbd\ub85c\ub97c \ucc3e\uace0, \ub9cc\uc57d \uc5c6\ub2e4\uba74 package \ud3f4\ub354\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">\uc77c\ub2e8 \uc800\uc7a5\uc18c\ub97c \uce90\uc2dc\ud558\uba74 \ucd94\ud6c4 \ud328\ud0a4\uc9c0\ub098 \uc571\uc744 \uc5c5\ub370\uc774\ud2b8 \ud558\uace0 \uc2f6\uc744 \ub54c, \uc6d0\uce58 \uc54a\ub294 \uacf3\uc5d0\uc11c \uc624\ub958\uac00 \ub0a0 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">\uadf8\ub807\uae30 \ub54c\ubb38\uc5d0 \ucd5c\ub300\ud55c \ubcf4\uc218\uc801\uc73c\ub85c \ube4c\ub4dc\ud558\uae30 \uc704\ud574\uc11c \uc800\ub294 \uce90\uc2dc\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294 \ubc29\uc2dd\uc73c\ub85c \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc791\uc131\ud588\uc2b5\ub2c8\ub2e4.<\/p>\n<pre id=\"code_1756805151260\" class=\"bash\" data-ke-language=\"bash\" data-ke-type=\"codeblock\"><code># git \uc800\uc7a5\uc18c \uce90\uc2dc \uc0ad\uc81c\ub97c \uc704\ud55c \ub2e8\uacc4 \ucd94\uac00\nrm -rf ~\/.cache\/pip\/git\n\n# \ub610\ub294 \uc804\uccb4 pip \uce90\uc2dc \uc0ad\uc81c\nrm -rf ~\/.cache\/pip<\/code><\/pre>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">\ub2e4\uc74c\uc73c\ub85c\ub294 \ubd80\ud2b8\uc2a4\ud2b8\ub7a9\uc5d0 \uc0ac\uc6a9\ud560 \ud30c\uc774\uc36c \ubc84\uc804\uc744 \uace0\uc815\ud558\uace0, \uc774\uac83\uc744 \uc0ac\uc6a9\ud558\ub3c4\ub85d \uc124\uc815\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">\uc5ec\uae30\uc11c Mac OS \uc571\uc744 \uac1c\ubc1c\ud558\uae30 \uc704\ud574\uc11c\ub294 \ub2f9\uc5f0\ud788 Mac\uc744 \uc0ac\uc6a9\ud560 \uac83\uc774\uace0, \ub300\ubd80\ubd84\uc740 Homebrew\ub97c \uc0ac\uc6a9\ud558\uc2e4 \uac83\uc774\uae30 \ub54c\ubb38\uc5d0 Homebrew\ub85c \uc124\uce58\ud55c \ud30c\uc774\uc36c\uc744 \uae30\uc900\uc73c\ub85c \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc791\uc131\ud558\uc600\uc2b5\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">export PYTHONNOUSERSITE=1 \ub97c \uc0ac\uc6a9\ud574 \uc0ac\uc6a9\uc790 \uc804\uc6a9 site-packages\ub97c \ub85c\ub4dc\ud558\uc9c0 \uc54a\ub3c4\ub85d \uaca9\ub9ac\uc2dc\ud0a4\uace0,<\/p>\n<p data-ke-size=\"size16\">pip\uc758 \ubc84\uc804 \uccb4\ud06c\ub97c \ube44\ud65c\uc131\ud654 \ud55c \ud6c4 \uce90\uc2dc\ub97c \uc81c\uac70\ud574\uc8fc\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<pre id=\"code_1756805339614\" class=\"bash\" data-ke-language=\"bash\" data-ke-type=\"codeblock\"><code># 1) \ubd80\ud2b8\uc2a4\ud2b8\ub7a9\uc5d0 \uc0ac\uc6a9\ud560 Python \uace0\uc815: (A) Homebrew python@3.13 \uc6b0\uc120, (B) PATH\uc758 python3.13\nPY_VER=\"3.13\"\nAPP_FW=\"$TARGET_BUILD_DIR\/$CONTENTS_FOLDER_PATH\/Frameworks\/Python.framework\"\n\nSITE_PKGS=\"$APP_FW\/Versions\/${PY_VER}\/lib\/python${PY_VER}\/site-packages\"\nmkdir -p \"$SITE_PKGS\"\n\n# (A) Homebrew python@3.13 (SSL \ud3ec\ud568)\nif [ -x \/opt\/homebrew\/opt\/python@3.13\/bin\/python3.13 ]; then\n  HOST_PY=\/opt\/homebrew\/opt\/python@3.13\/bin\/python3.13\nelif command -v python3.13 &gt;\/dev\/null 2&gt;&amp;1; then\n  # (B) PATH \uc5b4\ub518\uac00\uc758 python3.13\n  HOST_PY=\"$(command -v python3.13)\"\nelse\n  echo \"\u274c Python 3.13 \ud574\uc11d\uae30\ub97c \ucc3e\uc744 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. brew install python@3.13 \ub85c \uc124\uce58\ud558\uc138\uc694.\" &gt;&amp;2\n  exit 1\nfi\n\necho \"\u27a1\ufe0f \ubd80\ud2b8\uc2a4\ud2b8\ub7a9\uc5d0 \uc0ac\uc6a9\ud560 Python: $(\"$HOST_PY\" --version 2&gt;&amp;1)\"\nPYBIN=\"$HOST_PY\"\n\n# 2) site-packages \uacbd\ub85c\nexport PYTHONNOUSERSITE=1\nexport PIP_DISABLE_PIP_VERSION_CHECK=1\nexport PIP_NO_CACHE_DIR=1<\/code><\/pre>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">\uc774\uc81c \uc774\uac78 \uc644\ub8cc\ud588\ub2e4\uba74, \uc6b0\ub9ac\uac00 \uc6d0\ud558\ub294 \ud328\ud0a4\uc9c0\ub97c \uc120\ud0dd\ud558\uace0 \uc124\uce58\ud560 \uc900\ube44\uac00 \ub418\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<p style=\"color: #333333; text-align: start;\" data-ke-size=\"size16\">\uac04\ub2e8\ud558\uac8c pip\uc73c\ub85c \ud328\ud0a4\uc9c0\ub97c \uc124\uce58\ud558\uba74 \ub429\ub2c8\ub2e4.<\/p>\n<pre id=\"code_1756806680911\" class=\"bash\" data-ke-language=\"bash\" data-ke-type=\"codeblock\"><code>\"$PYBIN\" -m pip install \\\n    --upgrade --no-cache-dir --force-reinstall \\\n    \ud328\ud0a4\uc9c0 name \\\n    --target \"$SITE_PKGS\"<\/code><\/pre>\n<p style=\"color: #333333; text-align: start;\" data-ke-size=\"size16\">&nbsp;<\/p>\n<p style=\"color: #000000; text-align: start;\" data-ke-size=\"size16\"><b>\uc635\uc158\ubcc4 \uc758\ubbf8<\/b><\/p>\n<ul style=\"list-style-type: disc; color: #000000; text-align: start;\" data-ke-list-type=\"disc\">\n<li><b>pip install<\/b>\n<ul style=\"list-style-type: disc;\" data-ke-list-type=\"disc\">\n<li>&rarr; Python \ud328\ud0a4\uc9c0\ub97c \uc124\uce58\ud558\ub294 \uae30\ubcf8 \uba85\ub839\uc5b4.<\/li>\n<\/ul>\n<\/li>\n<li><b>--upgrade<\/b>\n<ul style=\"list-style-type: disc;\" data-ke-list-type=\"disc\">\n<li>&rarr; \uc774\ubbf8 \uc124\uce58\ub41c \ud328\ud0a4\uc9c0\uac00 \uc788\ub354\ub77c\ub3c4, \ub354 \ucd5c\uc2e0 \ubc84\uc804\uc774 \uc788\uc73c\uba74 \uc5c5\uadf8\ub808\uc774\ub4dc\ud568.<\/li>\n<\/ul>\n<\/li>\n<li><b>--no-cache-dir<\/b>(\uce90\uc2dc\uc5d0 \ub0a8\uc544\uc788\ub294 \uc624\ub798\ub41c wheel \ud30c\uc77c\uc774\ub098 tar.gz \ud30c\uc77c\uc744 \uc4f0\uc9c0 \uc54a\ub3c4\ub85d \uac15\uc81c)\n<ul style=\"list-style-type: disc;\" data-ke-list-type=\"disc\">\n<li>&rarr; pip \uce90\uc2dc \ub514\ub809\ud1a0\ub9ac\ub97c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uace0, \ud56d\uc0c1 \uc0c8\ub85c \ub2e4\uc6b4\ub85c\ub4dc\ud574\uc11c \uc124\uce58\ud568.<\/li>\n<\/ul>\n<\/li>\n<li><b>--force-reinstall<\/b>(\ub2e8\uc21c \uc5c5\uadf8\ub808\uc774\ub4dc\uac00 \uc544\ub2c8\ub77c \uac19\uc740 \ubc84\uc804\uc774\ub77c\ub3c4 \ub36e\uc5b4\uc500)\n<ul style=\"list-style-type: disc;\" data-ke-list-type=\"disc\">\n<li>&rarr; \ud574\ub2f9 \ud328\ud0a4\uc9c0\uac00 \uc774\ubbf8 \uc124\uce58\ub418\uc5b4 \uc788\uc5b4\ub3c4 \ubb34\uc870\uac74 \ub2e4\uc2dc \uc124\uce58\ud568.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">\uc544\ub798\ub294 \uc81c\uac00 \uc138\ud305\ud55c pip bootstrap phase \uc804\ubb38\uc785\ub2c8\ub2e4.<\/p>\n<pre id=\"code_1756390864588\" class=\"bash\" data-ke-language=\"bash\" data-ke-type=\"codeblock\"><code>#!\/bin\/sh\nset -e\n\n# git \uc800\uc7a5\uc18c \uce90\uc2dc \uc0ad\uc81c\ub97c \uc704\ud55c \ub2e8\uacc4 \ucd94\uac00\nrm -rf ~\/.cache\/pip\/git\n\n# \ub610\ub294 \uc804\uccb4 pip \uce90\uc2dc \uc0ad\uc81c\nrm -rf ~\/.cache\/pip\n\n# 1) \ubd80\ud2b8\uc2a4\ud2b8\ub7a9\uc5d0 \uc0ac\uc6a9\ud560 Python \uace0\uc815: (A) Homebrew python@3.13 \uc6b0\uc120, (B) PATH\uc758 python3.13\nPY_VER=\"3.13\"\nAPP_FW=\"$TARGET_BUILD_DIR\/$CONTENTS_FOLDER_PATH\/Frameworks\/Python.framework\"\n\nSITE_PKGS=\"$APP_FW\/Versions\/${PY_VER}\/lib\/python${PY_VER}\/site-packages\"\nmkdir -p \"$SITE_PKGS\"\n\n# (A) Homebrew python@3.13 (SSL \ud3ec\ud568)\nif [ -x \/opt\/homebrew\/opt\/python@3.13\/bin\/python3.13 ]; then\n  HOST_PY=\/opt\/homebrew\/opt\/python@3.13\/bin\/python3.13\nelif command -v python3.13 &gt;\/dev\/null 2&gt;&amp;1; then\n  # (B) PATH \uc5b4\ub518\uac00\uc758 python3.13\n  HOST_PY=\"$(command -v python3.13)\"\nelse\n  echo \"\u274c Python 3.13 \ud574\uc11d\uae30\ub97c \ucc3e\uc744 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. brew install python@3.13 \ub85c \uc124\uce58\ud558\uc138\uc694.\" &gt;&amp;2\n  exit 1\nfi\n\necho \"\u27a1\ufe0f \ubd80\ud2b8\uc2a4\ud2b8\ub7a9\uc5d0 \uc0ac\uc6a9\ud560 Python: $(\"$HOST_PY\" --version 2&gt;&amp;1)\"\nPYBIN=\"$HOST_PY\"\n\n# 2) site-packages \uacbd\ub85c\nexport PYTHONNOUSERSITE=1\nexport PIP_DISABLE_PIP_VERSION_CHECK=1\nexport PIP_NO_CACHE_DIR=1\n\n\n# 3) \ud504\ub85c\uc81d\ud2b8 \ud328\ud0a4\uc9c0 \uc124\uce58 (\ub2e4\ub978 \uc758\uc874\uc131 \ud3ec\ud568)\n\n\"$PYBIN\" -m pip --version || { echo \"\u274c pip not found\"; exit 1; }\n\n\"$PYBIN\" -m pip install \\\n    --upgrade --no-cache-dir --force-reinstall --no-deps \\\n    https:\/\/github.com\/qwertyquerty\/pypresence\/archive\/master.zip \\\n    --target \"$SITE_PKGS\"\n\n\"$PYBIN\" -m pip install \\\n    --upgrade --no-cache-dir --force-reinstall \\\n    pyatv aiohttp \\\n    --target \"$SITE_PKGS\"<\/code><\/pre>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">\uc774 phase\ub97c \uc644\ub8cc\ud558\uba74 python \ud328\ud0a4\uc9c0\ub97c framework\uc5d0 \uc9d1\uc5b4 \ub123\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">\ub2e4\ub9cc \uc2e4\ud589\uc2dc\ud0a4\uba74 \uc624\ub958\uac00 \ub730 \uac83\uc785\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">\uc774\uac83\uc744 \ud574\uacb0\ud558\uae30 \uc704\ud574 Xcode 16\uae30\uc900, User Script Sandboxing\ub97c \uaebc\uc8fc\uc5b4\uc57c\ub9cc \uc6b0\ub9ac\uac00 \ub9cc\ub4e0 shell script\uac00 \ud30c\uc77c\uc5d0 \uc811\uadfc\ud560 \uc218 \uc788\uac8c \ub418\uba74\uc11c \ube4c\ub4dc\uac00 \uc131\uacf5\ud558\uac8c \ub429\ub2c8\ub2e4.<\/p>\n<p><figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-filename=\"Screenshot 2025-08-28 at 11.30.53\u202fPM.png\" data-origin-width=\"1556\" data-origin-height=\"334\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/Queox\/btsQcleVmwp\/kJP9Rdw4ckvxlknYBox1rk\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/Queox\/btsQcleVmwp\/kJP9Rdw4ckvxlknYBox1rk\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/Queox\/btsQcleVmwp\/kJP9Rdw4ckvxlknYBox1rk\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQueox%2FbtsQcleVmwp%2FkJP9Rdw4ckvxlknYBox1rk%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"1556\" height=\"334\" data-filename=\"Screenshot 2025-08-28 at 11.30.53\u202fPM.png\" data-origin-width=\"1556\" data-origin-height=\"334\"\/><\/span><\/figure>\n<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h3 data-ke-size=\"size23\">2.1 \uadf8 \uc678 \ud2b9\uc218 \ucf00\uc774\uc2a4\ub4e4<\/h3>\n<p data-ke-size=\"size16\">\ud558\uc9c0\ub9cc \uc5ec\uae30\uc11c \uc27d\uac8c \ub05d\ub0ac\ub2e4\uba74 \uc81c\uac00 \uc774 \uae00\uc744 \uc4f0\uace0 \uc788\uc9c0 \uc54a\uc558\uc744 \uac83\uc785\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">\uc6b0\ub9ac\uac00 \uc4f0\ub294 \ud30c\uc774\uc36c \ud328\ud0a4\uc9c0\ub4e4 \uac00\uc6b4\ub370\ub294 \uc21c\uc218 \ud30c\uc774\uc36c\ub9cc\uc73c\ub85c \ub3d9\uc791\ud558\ub294 \uac83\ub3c4 \uc788\uc9c0\ub9cc, C \ud655\uc7a5 \ubaa8\ub4c8(.so) \uc744 \ud3ec\ud568\ud558\uac70\ub098 TLS(HTTPS \ubcf4\uc548 \ud1b5\uc2e0) \uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0\uac00 \ub9ce\uc2b5\ub2c8\ub2e4.<\/p>\n<h4 data-ke-size=\"size20\">3.1 OpenSSL \uc758\uc874\uc131\uc73c\ub85c \uc778\ud55c \ub85c\ub529 \uc2e4\ud328<\/h4>\n<ul style=\"list-style-type: disc;\" data-ke-list-type=\"disc\">\n<li>Python\uc758 \ub124\uc774\ud2f0\ube0c \ud655\uc7a5(.so)\uc774 SSL\/TLS \uae30\ub2a5\uc744 \uc0ac\uc6a9\ud560 \uacbd\uc6b0, OpenSSL \ub77c\uc774\ube0c\ub7ec\ub9ac\uc5d0 \ub300\ud55c \uc758\uc874\uc131\uc774 \uc0dd\uae30\ub294\ub370 macOS \uc571 \ubc88\ub4e4 \ub0b4\ubd80\uc5d0 OpenSSL \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \ub0b4\uc7a5\uc2dc\ud0a4\uc9c0 \uc54a\uc73c\uba74 dyld: Library not loaded \uc624\ub958\uac00 \ubc1c\uc0dd\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<p data-ke-size=\"size16\">Vendor&nbsp;SSL&nbsp;\uc2a4\ud06c\ub9bd\ud2b8\ub294&nbsp;Homebrew\uc5d0\uc11c&nbsp;\uc124\uce58\ub41c&nbsp;libssl.3.dylib\uc640&nbsp;libcrypto.3.dylib\uc744&nbsp;Frameworks\/OpenSSL\ub85c&nbsp;\ubcf5\uc0ac\ud574\uc90d\ub2c8\ub2e4.<\/p>\n<pre id=\"code_1757399162803\" class=\"bash\" data-ke-language=\"bash\" data-ke-type=\"codeblock\"><code>echo \"\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\"\necho \"  Vendor OpenSSL (libcrypto\/libssl) &rarr; Frameworks\/OpenSSL\"\nmkdir -p \"$DEST_OPENSSL_DIR\"\nif [ -f \"$SRC_CRYPTO\" ] &amp;&amp; [ -f \"$SRC_SSL\" ]; then\n  \"$RSYNC\" -a \"$SRC_CRYPTO\" \"$DEST_OPENSSL_DIR\/\"\n  \"$RSYNC\" -a \"$SRC_SSL\" \"$DEST_OPENSSL_DIR\/\"\n  # Set self IDs to @rpath\/OpenSSL\/* so dependent binaries can reference via rpath\n  safe_install_name_tool -id \"@rpath\/OpenSSL\/libcrypto.3.dylib\" \"$DEST_OPENSSL_DIR\/libcrypto.3.dylib\"\n  safe_install_name_tool -id \"@rpath\/OpenSSL\/libssl.3.dylib\" \"$DEST_OPENSSL_DIR\/libssl.3.dylib\"\n  # Ensure libssl references libcrypto via @rpath, too\n  patch_openssl_refs \"$DEST_OPENSSL_DIR\/libssl.3.dylib\"\nelse\n  echo \"\u26a0\ufe0f OpenSSL not found at $OPENSSL_SRC_PREFIX &mdash; skipping copy.\"\n  echo \"   (If you vendor OpenSSL differently, ensure files exist in $DEST_OPENSSL_DIR.)\"\nfi<\/code><\/pre>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">.so \ubc0f \uad00\ub828 \ubc14\uc774\ub108\ub9ac\uac00 \uc62c\ubc14\ub974\uac8c @rpath\/OpenSSL\/...\ub97c \ucc38\uc870\ud558\ub3c4\ub85d \ub0b4\ubd80 \uc758\uc874\uacbd\ub85c\ub97c \uc218\uc815\ud574\uc8fc\ub294 \uc2a4\ud06c\ub9bd\ud2b8\uc785\ub2c8\ub2e4.<\/p>\n<pre id=\"code_1757401177552\" class=\"bash\" data-ke-language=\"bash\" data-ke-type=\"codeblock\"><code>patch_openssl_refs() {\n  bin=\"$1\"\n  FROM_CRYPTO=\"$OPENSSL_SRC_PREFIX\/lib\/libcrypto.3.dylib\"\n  FROM_SSL=\"$OPENSSL_SRC_PREFIX\/lib\/libssl.3.dylib\"\n  TO_CRYPTO=\"@rpath\/OpenSSL\/libcrypto.3.dylib\"\n  TO_SSL=\"@rpath\/OpenSSL\/libssl.3.dylib\"\n  if \"$OTOOL\" -L \"$bin\" | grep -q \"$FROM_CRYPTO\"; then\n    echo \"  &bull; patch libcrypto -&gt; @rpath ($bin)\"\n    safe_install_name_tool -change \"$FROM_CRYPTO\" \"$TO_CRYPTO\" \"$bin\"\n  fi\n  if \"$OTOOL\" -L \"$bin\" | grep -q \"$FROM_SSL\"; then\n    echo \"  &bull; patch libssl -&gt; @rpath ($bin)\"\n    safe_install_name_tool -change \"$FROM_SSL\" \"$TO_SSL\" \"$bin\"\n  fi\n}<\/code><\/pre>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">\uba54\uc778 \ud30c\uc77c \ubc0f \ub124\uc774\ud2f0\ube0c \ud655\uc7a5\uc5d0\uc11c \ub85c\ub4dc \ud560 \ub54c \ud544\uc694\ud55c @rpath\uacbd\ub85c(@excutable_path\/..\/Frameworks\/OpenSSL)\uc744 RPATH\uc5d0 \ucd94\uac00\ud574\uc8fc\ub294 \uc2a4\ud06c\ub9bd\ud2b8\uc785\ub2c8\ub2e4.<\/p>\n<pre id=\"code_1757401401764\" class=\"bash\" data-ke-language=\"bash\" data-ke-type=\"codeblock\"><code>add_rpath_if_missing() {\n  bin=\"$1\"; rpath=\"$2\"\n  if \"$OTOOL\" -l \"$bin\" | grep -A2 LC_RPATH | grep -q \"$rpath\"; then\n    return 0\n  fi\n  echo \"  &bull; add_rpath $rpath -&gt; $(basename \"$bin\")\"\n  if ! safe_install_name_tool -add_rpath \"$rpath\" \"$bin\"; then\n    echo \"    \u26a0\ufe0f add_rpath failed (likely headerpad too small).\"\n    echo \"       \u279c Prefer link\u2011time LD_RUNPATH_SEARCH_PATHS to include:\"\n    echo \"         @executable_path\/..\/Frameworks\"\n    echo \"         @executable_path\/..\/Frameworks\/OpenSSL\"\n  fi\n}<\/code><\/pre>\n<ul style=\"list-style-type: disc;\" data-ke-list-type=\"disc\">\n<li><b>(\uc8fc\uc758\uc810) Runpath Search Path\uc5d0 @executable_path\/..\/Frameworks\/OpenSSL\uc744 \ucd94\uac00\ud574\uc8fc\uc154\uc57c install name tool\uc758 \ubc14\uc774\ub108\ub9ac \ub85c\ub4dc \ucee4\ub9e8\ub4dc \uacf5\uac04(headerpad)\uac00 \ubd80\uc871\ud568 \uc5c6\uc774 \ub3d9\uc791\ud558\uae30 \ub54c\ubb38\uc5d0 \ub123\uc5b4\uc8fc\uc154\uc57c \ud569\ub2c8\ub2e4.<\/b><\/li>\n<\/ul>\n<p><figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-filename=\"Screenshot 2025-08-29 at 12.31.48\u202fAM.png\" data-origin-width=\"3716\" data-origin-height=\"710\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/urK6e\/btsQco3CNgy\/neiP74n4dpKKcAKXYKokT1\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/urK6e\/btsQco3CNgy\/neiP74n4dpKKcAKXYKokT1\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/urK6e\/btsQco3CNgy\/neiP74n4dpKKcAKXYKokT1\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FurK6e%2FbtsQco3CNgy%2FneiP74n4dpKKcAKXYKokT1%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"3716\" height=\"710\" data-filename=\"Screenshot 2025-08-29 at 12.31.48\u202fAM.png\" data-origin-width=\"3716\" data-origin-height=\"710\"\/><\/span><\/figure>\n<\/p>\n<h4 data-ke-size=\"size20\">3.2 .so(\ud30c\uc774\uc36c \ub124\uc774\ud2f0\ube0c \ud655\uc7a5) \uc7ac\uc11c\uba85 \ud544\uc694<\/h4>\n<ul style=\"list-style-type: disc;\" data-ke-list-type=\"disc\">\n<li>code signature not valid for use in process, mapping process and mapped file have different Team IDs \uc624\ub958\uac00 \ub728\ub294 \uacbd\uc6b0\uac00 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<li>macOS\uc758 Hardened Runtime \ub54c\ubb38\uc5d0 \uc571\uc774 \ub85c\ub4dc\ud558\ub294 \ubaa8\ub4e0 \ub124\uc774\ud2f0\ube0c \ucf54\ub4dc(.dylib, .so) \uac00 \ub3d9\uc77c Team ID\ub85c \uc11c\uba85\ub418\uc5b4 \uc788\uc5b4\uc57c \ud558\uae30 \ub54c\ubb38\uc73c\ub85c, \uc544\ub798 \uc2a4\ud06c\ub9bd\ud2b8\ub4e4\uc744 \ud1b5\ud574 \ud574\uacb0\ud574\uc8fc\uc5c8\uc2b5\ub2c8\ub2e4.<\/li>\n<\/ul>\n<p data-ke-size=\"size16\"><b>sign_file - \ub2e8\uc77c \ud30c\uc77c \uc11c\uba85<\/b><\/p>\n<pre id=\"code_1758791822658\" class=\"bash\" data-ke-language=\"bash\" data-ke-type=\"codeblock\"><code>sign_file() {\n  \"$CODESIGN\" --force --options runtime --timestamp --sign \"$SIGN_IDENTITY\" \"$1\"\n}<\/code><\/pre>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">\uc774 \ud568\uc218\ub294 \uc9c0\uc815\ud55c \ud30c\uc77c\uc744 Hardened Runtime \uc635\uc158\uc73c\ub85c \uc9c0\uc815\ud55c ID\ub85c \uc11c\uba85\ud558\ub3c4\ub85d \ud574\uc90d\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">\ub7f0\ud0c0\uc784\uc5d0 \ub85c\ub4dc\ub418\ub294 \ub124\uc774\ud2f0\ube0c \ucf54\ub4dc\ub97c OS\uac00 \uc2e0\ub8b0\ud558\ub3c4\ub85d \ub9cc\ub4e4\uc5b4\uc8fc\ub294 \uc5ed\ud560\uc785\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\"><b>sign_glob_under&nbsp;&mdash;&nbsp;\ud3f4\ub354&nbsp;\ub0b4&nbsp;\ub2e4\uc218&nbsp;\ud30c\uc77c&nbsp;\uc77c\uad04&nbsp;\uc11c\uba85<\/b><b><\/b><\/p>\n<pre id=\"code_1758791907867\" class=\"bash\" data-ke-language=\"bash\" data-ke-type=\"codeblock\"><code>sign_glob_under() {\n  dir=\"$1\"; pat=\"$2\"\n  [ -d \"$dir\" ] || return 0\n  \"$FIND\" \"$dir\" -type f -name \"$pat\" -print0 | while IFS= read -r -d '' f; do\n    echo \"  &bull; codesign $f\"\n    sign_file \"$f\"\n  done\n}<\/code><\/pre>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">\uc774 \ud568\uc218\ub294 find\ub85c dir \uc544\ub798 pat\uc5d0 \ub9e4\uce6d\ub418\ub294 \ubaa8\ub4e0 \ud30c\uc77c\uc744 \ucc3e\uc544 \uc77c\uad04 \uc11c\uba85\ud558\ub294 \uc5ed\ud560\uc778\ub370,<\/p>\n<p data-ke-size=\"size16\">\ud30c\uc774\uc36c \ud655\uc7a5\ub4e4\uc740 \ubcf4\ud1b5 \uc5ec\ub7ec\uac1c\uc5d0\ub2e4 \uacbd\ub85c\ub3c4 \ub2e4\uc591\ud558\uae30 \ub54c\ubb38\uc5d0, \ub204\ub77d \uc5c6\uc774 \ud55c\ubc88\uc5d0 \ucc98\ub9ac\ud558\uae30 \uc704\ud574 \uc0ac\uc6a9\ud588\uc2b5\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\"><b>(\ucc38\uace0)&nbsp;sign_file_maybe_entitlements<\/b><\/p>\n<p data-ke-size=\"size16\">\uc774 \ud568\uc218\uc758 \uacbd\uc6b0 Entitlements \ud30c\uc77c\uc774 \uc9c0\uc815\ub41c \uacbd\uc6b0\uc5d0\ub9cc \uadf8 entitlements\ub97c \ubd99\uc5ec \uc11c\uba85\ud558\ub294 \uc5ed\ud560\uc778\ub370, \ubcf4\ud1b5 .so\/.dylib\uc5d0 \ubcc4\ub3c4 entitlements\ub294 \ud544\uc694\uc5c6\uc73c\ubbc0\ub85c .so \uc11c\uba85\uc5d0\ub294 sign_file\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<pre id=\"code_1758792267703\" class=\"bash\" data-ke-language=\"bash\" data-ke-type=\"codeblock\"><code># Python natives &amp; framework\nif [ \"$PY_HAS_FRAMEWORK\" -eq 1 ]; then\n  sign_glob_under \"$PY_LIBDIR\/lib-dynload\" \"*.so\"\n  sign_glob_under \"$PY_LIBDIR\/site-packages\" \"*.so\"\n  sign_glob_under \"$PY_LIBDIR\/site-packages\" \"*.dylib\"\n  sign_glob_under \"$FW_BASE\/lib\" \"*.dylib\"\n  sign_file \"$PY_FW_DIR\"\nfi<\/code><\/pre>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">\uc704\uc5d0 \uc5b8\uae09\ud55c \ud568\uc218\ub4e4\uc744 \uc774\uc6a9\ud574 \uc774\ub807\uac8c, \uc11c\uba85\ud558\uba74 \ub429\ub2c8\ub2e4.<\/p>\n<h4 data-ke-size=\"size20\">3.3 Xcode\uac00 \uc0dd\uc131\ud558\ub294 \ubcf4\uc870 \ubc14\uc774\ub108\ub9ac\ub85c \uc778\ud55c \uc624\ub958<\/h4>\n<ul style=\"list-style-type: disc;\" data-ke-list-type=\"disc\">\n<li>\uc774\ub294 \ubcf4\uc870\uc801\uc778 \uc624\ub958\uc778\ub370\uc694, \uc6d0\ub798 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\uc558\ub2e4\uac00 Xcode 16\ubd80\ud130 \uc0dd\uae34 \uc774\uc288\uc778 \uac83 \uac19\uc544 \uae30\ub85d\ucc28\uc6d0\uc5d0\uc11c \ub0a8\uaca8\ub193\uc2b5\ub2c8\ub2e4.<\/li>\n<li>\uba54\uc778 \ubc14\uc774\ub108\ub9ac \uc11c\uba85 \ud560 \ub54c, &ldquo;In&nbsp;subcomponent:&nbsp;&hellip;\/MacOS\/__preview.dylib&rdquo;&nbsp;\ub610\ub294&nbsp;&hellip;\/PRODUCT_NAME.debug.dylib\ub85c&nbsp;\uc778\ud574<br \/>&ldquo;code object is not signed at all&rdquo; \ub4f1\uc758 \uc5d0\ub7ec\uac00 \ubc1c\uc0dd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<br \/>\uc774\ub294 SwiftUI Preview\uc6a9 __preview.dylib, \ub514\ubc84\uadf8 \ubcf4\uc870 \uc0b0\ucd9c\ubb3c *.debug.dylib \uc774 \uc571 \ubc88\ub4e4\uc5d0 \ub4e4\uc5b4\uc640 \uc11c\uba85 \ud2b8\ub9ac\ub97c \uae68\ub728\ub9ac\ub294\uac8c \uc6d0\uc778\uc778\ub370\uc694, Build Option\uc5d0\uc11c Enable Debug Dylib Support\ub97c NO\ub85c \ubc14\uafd4\uc8fc\uc2dc\uba74 \ub429\ub2c8\ub2e4.<\/li>\n<\/ul>\n<p><figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-filename=\"Screenshot 2025-08-29 at 12.54.07\u202fAM.png\" data-origin-width=\"1214\" data-origin-height=\"244\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/cJqun0\/btsQb8GG9F9\/FFDvNE9IjuOQOV0KLmGMd1\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/cJqun0\/btsQb8GG9F9\/FFDvNE9IjuOQOV0KLmGMd1\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/cJqun0\/btsQb8GG9F9\/FFDvNE9IjuOQOV0KLmGMd1\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJqun0%2FbtsQb8GG9F9%2FFFDvNE9IjuOQOV0KLmGMd1%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"1214\" height=\"244\" data-filename=\"Screenshot 2025-08-29 at 12.54.07\u202fAM.png\" data-origin-width=\"1214\" data-origin-height=\"244\"\/><\/span><\/figure>\n<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">\ub2e4\uc74c\uc740 \ub2e4\uc74c \uc624\ub958\ub97c \uc804\ubd80 \uc218\uc815\ud560 \uc218 \uc788\ub294 shell script \uc804\ubb38\uc785\ub2c8\ub2e4.<\/p>\n<pre id=\"code_1756396561148\" class=\"bash\" data-ke-language=\"bash\" data-ke-type=\"codeblock\"><code>#!\/bin\/sh\n\n##############################################################################\n# 0) Common paths &amp; inputs\n##############################################################################\nAPP_WRAPPER=\"$TARGET_BUILD_DIR\/$WRAPPER_NAME\"\nAPP_MACOS=\"$APP_WRAPPER\/Contents\/MacOS\"\nAPP_RES=\"$APP_WRAPPER\/Contents\/Resources\"\nAPP_FWKS=\"$APP_WRAPPER\/Contents\/Frameworks\"\n\n# Configurable: Apple Silicon Homebrew prefix by default\nOPENSSL_SRC_PREFIX=\"${OPENSSL_SRC_PREFIX:-\/opt\/homebrew\/opt\/openssl@3}\"\nSRC_CRYPTO=\"$OPENSSL_SRC_PREFIX\/lib\/libcrypto.3.dylib\"\nSRC_SSL=\"$OPENSSL_SRC_PREFIX\/lib\/libssl.3.dylib\"\nDEST_OPENSSL_DIR=\"$APP_FWKS\/OpenSSL\"\n\n# Optional extras\nENTITLEMENTS_FILE=\"${ENTITLEMENTS_FILE:-}\"\nEXTRA_SIGN_BINARIES=\"${EXTRA_SIGN_BINARIES:-}\"\n\nPYTHON_FRAMEWORK_NAME=\"Python.framework\"\nPY_FW_DIR=\"$APP_FWKS\/$PYTHON_FRAMEWORK_NAME\"\nPY_HAS_FRAMEWORK=0\n\n# Tools (absolute paths to avoid PATH shadowing)\nCODESIGN=\"\/usr\/bin\/codesign\"\nOTOOL=\"\/usr\/bin\/otool\"\nINTOOL=\"\/usr\/bin\/install_name_tool\"\nCHMOD=\"\/bin\/chmod\"\nFIND=\"\/usr\/bin\/find\"\nRSYNC=\"\/usr\/bin\/rsync\"\n\nSIGN_IDENTITY=\"${EXPANDED_CODE_SIGN_IDENTITY:-}\"\nif [ -z \"$SIGN_IDENTITY\" ]; then\n  echo \"\u274c EXPANDED_CODE_SIGN_IDENTITY is empty &mdash; configure Signing.\" &gt;&amp;2\n  exit 1\nfi\n\n##############################################################################\n# 1) Helpers\n##############################################################################\nsign_file() {\n  \"$CODESIGN\" --force --options runtime --timestamp --sign \"$SIGN_IDENTITY\" \"$1\"\n}\n\nsign_file_maybe_entitlements() {\n  file=\"$1\"\n  if [ -n \"$ENTITLEMENTS_FILE\" ] &amp;&amp; [ -f \"$ENTITLEMENTS_FILE\" ]; then\n    \"$CODESIGN\" --force --options runtime --timestamp \\\n      --entitlements \"$ENTITLEMENTS_FILE\" \\\n      --sign \"$SIGN_IDENTITY\" \"$file\"\n  else\n    sign_file \"$file\"\n  fi\n}\n\nXATTR=\"\/usr\/bin\/xattr\"\n\nsign_file_nonfatal() {\n  file=\"$1\"\n  # Best effort: clear quarantine and make writable, then try codesign; never fail the build\n  $XATTR -dr com.apple.quarantine \"$file\" 2&gt;\/dev\/null || true\n  \/bin\/chmod u+w \"$file\" 2&gt;\/dev\/null || true\n  if [ -n \"$ENTITLEMENTS_FILE\" ] &amp;&amp; [ -f \"$ENTITLEMENTS_FILE\" ]; then\n    \"$CODESIGN\" --force --options runtime --timestamp \\\n      --entitlements \"$ENTITLEMENTS_FILE\" \\\n      --sign \"$SIGN_IDENTITY\" \"$file\" || echo \"    \u26a0\ufe0f nonfatal: codesign failed for $file\"\n  else\n    \"$CODESIGN\" --force --options runtime --timestamp \\\n      --sign \"$SIGN_IDENTITY\" \"$file\" || echo \"    \u26a0\ufe0f nonfatal: codesign failed for $file\"\n  fi\n}\n\nsign_glob_under() {\n  dir=\"$1\"; pat=\"$2\"\n  [ -d \"$dir\" ] || return 0\n  # NUL\u2011delimited traversal to survive spaces in paths\n  \"$FIND\" \"$dir\" -type f -name \"$pat\" -print0 | while IFS= read -r -d '' f; do\n    echo \"  &bull; codesign $f\"\n    sign_file \"$f\"\n  done\n}\n\nsafe_install_name_tool() {\n  # Usage: safe_install_name_tool &lt;args...&gt; &lt;target&gt;\n  # Make target writable and do not fail the whole build if a change is impossible.\n  # Determine last arg as target\n  set -- \"$@\"; last=\"$*\"; target=${last##* }\n  \"$CHMOD\" u+w \"$target\" 2&gt;\/dev\/null || true\n  if ! \"$INTOOL\" \"$@\"; then\n    echo \"    \u26a0\ufe0f install_name_tool failed on $(basename \"$target\") &mdash; continuing; will re\u2011sign later\"\n    return 0\n  fi\n}\n\nadd_rpath_if_missing() {\n  bin=\"$1\"; rpath=\"$2\"\n  if \"$OTOOL\" -l \"$bin\" | grep -A2 LC_RPATH | grep -q \"$rpath\"; then\n    return 0\n  fi\n  echo \"  &bull; add_rpath $rpath -&gt; $(basename \"$bin\")\"\n  if ! safe_install_name_tool -add_rpath \"$rpath\" \"$bin\"; then\n    echo \"    \u26a0\ufe0f add_rpath failed (likely headerpad too small).\"\n    echo \"       \u279c Prefer link\u2011time LD_RUNPATH_SEARCH_PATHS to include:\"\n    echo \"         @executable_path\/..\/Frameworks\"\n    echo \"         @executable_path\/..\/Frameworks\/OpenSSL\"\n  fi\n}\n\npatch_openssl_refs() {\n  bin=\"$1\"\n  FROM_CRYPTO=\"$OPENSSL_SRC_PREFIX\/lib\/libcrypto.3.dylib\"\n  FROM_SSL=\"$OPENSSL_SRC_PREFIX\/lib\/libssl.3.dylib\"\n  TO_CRYPTO=\"@rpath\/OpenSSL\/libcrypto.3.dylib\"\n  TO_SSL=\"@rpath\/OpenSSL\/libssl.3.dylib\"\n  if \"$OTOOL\" -L \"$bin\" | grep -q \"$FROM_CRYPTO\"; then\n    echo \"  &bull; patch libcrypto -&gt; @rpath ($bin)\"\n    safe_install_name_tool -change \"$FROM_CRYPTO\" \"$TO_CRYPTO\" \"$bin\"\n  fi\n  if \"$OTOOL\" -L \"$bin\" | grep -q \"$FROM_SSL\"; then\n    echo \"  &bull; patch libssl -&gt; @rpath ($bin)\"\n    safe_install_name_tool -change \"$FROM_SSL\" \"$TO_SSL\" \"$bin\"\n  fi\n}\n\n##############################################################################\n# 2) Vendor OpenSSL into app &amp; set install_name IDs\n##############################################################################\necho \"\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\"\necho \"  Vendor OpenSSL (libcrypto\/libssl) &rarr; Frameworks\/OpenSSL\"\nmkdir -p \"$DEST_OPENSSL_DIR\"\nif [ -f \"$SRC_CRYPTO\" ] &amp;&amp; [ -f \"$SRC_SSL\" ]; then\n  \"$RSYNC\" -a \"$SRC_CRYPTO\" \"$DEST_OPENSSL_DIR\/\"\n  \"$RSYNC\" -a \"$SRC_SSL\" \"$DEST_OPENSSL_DIR\/\"\n  # Set self IDs to @rpath\/OpenSSL\/* so dependent binaries can reference via rpath\n  safe_install_name_tool -id \"@rpath\/OpenSSL\/libcrypto.3.dylib\" \"$DEST_OPENSSL_DIR\/libcrypto.3.dylib\"\n  safe_install_name_tool -id \"@rpath\/OpenSSL\/libssl.3.dylib\" \"$DEST_OPENSSL_DIR\/libssl.3.dylib\"\n  # Ensure libssl references libcrypto via @rpath, too\n  patch_openssl_refs \"$DEST_OPENSSL_DIR\/libssl.3.dylib\"\nelse\n  echo \"\u26a0\ufe0f OpenSSL not found at $OPENSSL_SRC_PREFIX &mdash; skipping copy.\"\n  echo \"   (If you vendor OpenSSL differently, ensure files exist in $DEST_OPENSSL_DIR.)\"\nfi\n\n##############################################################################\n# 3) Patch all MacOS\/* for RPATH + deps (executables &amp; dylibs)\n##############################################################################\necho \"\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\"\necho \"  Fix RPATH &amp; deps in Contents\/MacOS\/*\"\nif [ -d \"$APP_MACOS\" ]; then\n  \"$FIND\" \"$APP_MACOS\" -type f \\( -name \"*.dylib\" -o -perm -111 \\) -print0 \\\n    | while IFS= read -r -d '' bin; do\n        add_rpath_if_missing \"$bin\" \"@executable_path\/..\/Frameworks\"\n        add_rpath_if_missing \"$bin\" \"@executable_path\/..\/Frameworks\/OpenSSL\"\n        patch_openssl_refs \"$bin\"\n      done\nfi\n\n# Optional: extra specific binaries to patch\/sign (newline or space separated)\nif [ -n \"$EXTRA_SIGN_BINARIES\" ]; then\n  echo \"  Patch deps in EXTRA_SIGN_BINARIES\"\n  printf '%s\\n' $EXTRA_SIGN_BINARIES | while IFS= read -r D; do\n    [ -n \"$D\" ] &amp;&amp; [ -e \"$D\" ] &amp;&amp; patch_openssl_refs \"$D\" || true\n  done\nfi\n\n##############################################################################\n# 4) Python.framework detection &amp; patching of native modules\n##############################################################################\necho \"\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\"\necho \"  Patch deps in Python natives (.so\/.dylib)\"\nif [ -d \"$PY_FW_DIR\" ]; then\n  PY_HAS_FRAMEWORK=1\n  if [ -L \"$PY_FW_DIR\/Versions\/Current\" ]; then\n    PY_VER_DIR=`readlink \"$PY_FW_DIR\/Versions\/Current\"`\n  else\n    # Pick highest 3.x directory in Versions\n    PY_VER_DIR=`ls -d \"$PY_FW_DIR\"\/Versions\/3.* 2&gt;\/dev\/null \\\n      | sed 's#.*\/##' \\\n      | awk -F. '{print $1\".\"$2}' \\\n      | sort -t. -k2,2n \\\n      | tail -n1`\n  fi\n  if [ -z \"$PY_VER_DIR\" ]; then\n    echo \"\u274c Unable to determine Python.framework version\" &gt;&amp;2\n    exit 1\n  fi\n  PY_VER=\"$PY_VER_DIR\"                                  # e.g. 3.13\n  FW_BASE=\"$PY_FW_DIR\/Versions\/$PY_VER\"\n  PY_LIBDIR=\"$FW_BASE\/lib\/python$PY_VER\"                # e.g. ...\/lib\/python3.13\n  echo \"  Python.framework: $PY_VER\"\n\n  for scan_dir in \\\n    \"$PY_LIBDIR\/lib-dynload\" \\\n    \"$PY_LIBDIR\/site-packages\" \\\n    \"$FW_BASE\/lib\"\n  do\n    [ -d \"$scan_dir\" ] || continue\n    \"$FIND\" \"$scan_dir\" -type f \\( -name \"*.so\" -o -name \"*.dylib\" \\) -print0 \\\n      | while IFS= read -r -d '' f; do\n          patch_openssl_refs \"$f\"\n        done\n  done\nelse\n  echo \"\u2139\ufe0f Python.framework not found &mdash; skipping Python patch\/sign.\"\nfi\n\n# Resources\/PythonSupport mirror (if you vendor Python there too)\nRES_PYSUP=\"$APP_RES\/PythonSupport\"\nif [ -d \"$RES_PYSUP\" ]; then\n  \"$FIND\" \"$RES_PYSUP\" -type f \\( -name \"*.so\" -o -name \"*.dylib\" -o -perm -111 \\) -print0 \\\n    | while IFS= read -r -d '' f; do\n        patch_openssl_refs \"$f\"\n      done\nfi\n\n##############################################################################\n# 5) Codesign: OpenSSL &rarr; Python natives &rarr; Framework &rarr; Resources &rarr; App\n##############################################################################\necho \"\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\"\necho \"  Codesign everything\"\n\n# OpenSSL\nsign_glob_under \"$DEST_OPENSSL_DIR\" \"*.dylib\"\n\n# Python natives &amp; framework\nif [ \"$PY_HAS_FRAMEWORK\" -eq 1 ]; then\n  sign_glob_under \"$PY_LIBDIR\/lib-dynload\" \"*.so\"\n  sign_glob_under \"$PY_LIBDIR\/site-packages\" \"*.so\"\n  sign_glob_under \"$PY_LIBDIR\/site-packages\" \"*.dylib\"\n  sign_glob_under \"$FW_BASE\/lib\" \"*.dylib\"\n  sign_file \"$PY_FW_DIR\"\nfi\n\n# Resources\/PythonSupport\nif [ -d \"$RES_PYSUP\" ]; then\n  sign_glob_under \"$RES_PYSUP\" \"*.so\"\n  sign_glob_under \"$RES_PYSUP\" \"*.dylib\"\nfi\n\n# All resource executables (if any); use ENTITLEMENTS_FILE when provided\nif [ -d \"$APP_RES\" ]; then\n  \"$FIND\" \"$APP_RES\" -type f -perm -111 -print0 \\\n    | while IFS= read -r -d '' exe; do\n        echo \"  &bull; codesign resource exec $exe\"\n        sign_file_maybe_entitlements \"$exe\"\n      done\nfi\n\n# Extra explicit binaries to sign (if provided)\nif [ -n \"$EXTRA_SIGN_BINARIES\" ]; then\n  printf '%s\\n' $EXTRA_SIGN_BINARIES | while IFS= read -r D; do\n    [ -n \"$D\" ] &amp;&amp; [ -e \"$D\" ] &amp;&amp; sign_file \"$D\" || true\n  done\nfi\n\n# Main binary (re\u2011sign last)\nif [ -f \"$APP_MACOS\/$PRODUCT_NAME\" ]; then\n  sign_file \"$APP_MACOS\/$PRODUCT_NAME\"\nfi\n\necho \"\u2705 Done: OpenSSL vendoring + @rpath patch + codesign\"<\/code><\/pre>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">\ub2e8\uc21c\ud788 \ubcf5\uc0ac\/\ubd99\uc5ec\ub123\uae30\ub9cc \ud558\uc154\ub3c4 \ub300\ubd80\ubd84\uc758 \uc0c1\ud669\uc5d0\uc11c\ub294 \uc544\ub9c8 \ub3d9\uc791\ud560 \ub4ef \uc2f6\uc5b4\uc11c \uacf5\uc720\ub4dc\ub9bd\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">\uc5ec\uae30\uae4c\uc9c0 \uc798 \ub530\ub77c \uc624\uc168\ub2e4\uba74 \uc774\uc81c \uc571\uc5d0 \uc544\ub984\ub2f5\uac8c \ube4c\ub4dc \ub41c \uc6b0\ub9ac\uc758 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub4e4\uc744 \ud655\uc778\ud558\uc2e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p><figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-filename=\"Screenshot 2025-09-25 at 6.34.09\u202fPM.png\" data-origin-width=\"2024\" data-origin-height=\"1124\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/Yj6zZ\/btsQPoW4kTT\/ySlV3BKLUP64BwpE9BPxYk\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/Yj6zZ\/btsQPoW4kTT\/ySlV3BKLUP64BwpE9BPxYk\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/Yj6zZ\/btsQPoW4kTT\/ySlV3BKLUP64BwpE9BPxYk\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYj6zZ%2FbtsQPoW4kTT%2FySlV3BKLUP64BwpE9BPxYk%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"2024\" height=\"1124\" data-filename=\"Screenshot 2025-09-25 at 6.34.09\u202fPM.png\" data-origin-width=\"2024\" data-origin-height=\"1124\"\/><\/span><\/figure>\n<\/p>\n<p data-ke-size=\"size16\">\ub2e4\uc74c\uc740 \uc774\ub807\uac8c \ube4c\ub4dc\ub41c \ud30c\uc774\uc36c\uc744 \uc5b4\ub5bb\uac8c Applepie-RPC\uc571\uc5d0\uc11c \uba54\uc778\uc2a4\ub808\ub4dc\uc758 \uc81c\uc57d\uc5d0\uc11c \ubc97\uc5b4\ub098 \uc11c\ube44\uc2a4 \ub808\uc774\uc5b4\uc5d0\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc5c8\ub294\uc9c0\uc5d0 \ub300\ud574 \ub2e4\ub904\ubcf4\ub3c4\ub85d \ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">\ub610\ud55c \uc2dc\uac04\uc774 \ub41c\ub2e4\uba74 iOS\uc571\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\ub3c4 \ud14c\uc2a4\ud2b8 \uac80\uc99d \ubc0f \uc815\ub9ac\ud574\ubcf4\ub3c4\ub85d \ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">\uae34 \uae00 \uc77d\uc5b4\uc8fc\uc154\uc11c \uac10\uc0ac\ud569\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">\ub367\ubd99\uc774\uac70\ub098 \ub354 \uc774\uc57c\uae30\ud558\uace0 \uc2f6\uc740 \ub0b4\uc6a9\uc740 \uc790\uc720\ub86d\uac8c \ub313\uae00 \ub2ec\uc544\uc8fc\uc2dc\uba74 \ud655\uc778 \ud6c4 \ub2f5\ubcc0 \ub4dc\ub9ac\uaca0\uc2b5\ub2c8\ub2e4. :)<\/p>","category":["ios","Python","swift","SwiftUI","\ud30c\uc774\uc36c"],"author":"Skyline-23","guid":"https:\/\/ios-dev-skyline-23.tistory.com\/31","comments":"https:\/\/ios-dev-skyline-23.tistory.com\/31#entry31comment","pubDate":"Thu, 25 Sep 2025 18:42:03 +0900"},{"title":"SwiftUI - \uc870\uc2ec\uc2a4\ub7ec\uc6b4 \uccab \uac78\uc74c","link":"https:\/\/ios-dev-skyline-23.tistory.com\/30","description":"<p><figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-origin-width=\"1920\" data-origin-height=\"1080\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/M87ww\/btsBeLzmSPu\/YzZQHUeqSktXIMlB5P17f0\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/M87ww\/btsBeLzmSPu\/YzZQHUeqSktXIMlB5P17f0\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/M87ww\/btsBeLzmSPu\/YzZQHUeqSktXIMlB5P17f0\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM87ww%2FbtsBeLzmSPu%2FYzZQHUeqSktXIMlB5P17f0%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"1920\" height=\"1080\" data-origin-width=\"1920\" data-origin-height=\"1080\"\/><\/span><\/figure>\n<\/p>\n<p style=\"color: #000000; text-align: start;\" data-ke-size=\"size16\">\uc548\ub155\ud558\uc138\uc694 \ud558\ub298\uc120\uc785\ub2c8\ub2e4~! \uc601\uc5b4 \ub2c9\ub124\uc784\uc744 \ubb50\ub85c \uc815\ud558\uc9c0 \uace0\ubbfc\uc744 \ud558\ub2e4\uac00, \uadf8\ub0e5 \ud3b8\ud558\uac8c \ud558\ub298\uc120\uc774\ub77c\uace0 \ud558\uae30\ub85c \ud588\uc5b4\uc694 \u314e\u314e<\/p>\n<p style=\"color: #000000; text-align: start;\" data-ke-size=\"size16\">&nbsp;<\/p>\n<p style=\"color: #000000; text-align: start;\" data-ke-size=\"size16\">\uc778\uc0bf\ub9d0\uc774 \uae38\uc5c8\ub124\uc694. \uc624\ub298\uc740 \uae34 \ud734\uc2dd\uc744 \ub05d\ub0b4\uace0 \uc0c8\ub85c\uc6b4 \uc2dc\uc791\uc744 \ud574\ubcf4\uace0\uc790, \uac01\uc885 \ud551\uacc4\ub97c \ub300\uba70 \ubbf8\ub8e8\uace0 \ubbf8\ub904\uc654\ub358 SwiftUI\uc5d0 \ub300\ud55c \uacf5\ubd80\ub97c \ud574\ubcf4\ub824\uace0 \ud569\ub2c8\ub2e4  <\/p>\n<p style=\"color: #000000; text-align: start;\" data-ke-size=\"size16\">iOS \uc804\ubc18\uc801\uc778 \ub3d9\ud5a5\uc744 \uc0b4\ud3b4\ubcf4\uba74, \uc774\uc81c \uc2ac\uc2ac \ud604\uc5c5\uc5d0\uc11c SwiftUI\uac00 \uc0ac\uc6a9\ub418\uae30 \uc2dc\uc791\ud558\ub294 \ucd94\uc138\uc778 \uac83 \uac19\uc544\uc694.<\/p>\n<p style=\"color: #000000; text-align: start;\" data-ke-size=\"size16\">SwiftUI\uac00 \ucc98\uc74c \ub098\uc624\uace0 \ub09c \ud6c4\uc5d0\uc11c\ub3c4 \ub9ce\uc740 \uac1c\uc120\uc774 \uc774\ub8e8\uc5b4\uc84c\ub294\ub370\uc694, \ud2b9\ud788 iOS 14 \uc774\ud6c4\uc640 \uc774\uc804\uc5d0 \uc4f8 \uc218 \uc788\ub294 \uba54\uc11c\ub4dc\ub098 \ubb38\ubc95 \ucc28\uc774\uac00 \ud070 \uac83 \uac19\uc544\uc694.<\/p>\n<p style=\"color: #000000; text-align: start;\" data-ke-size=\"size16\">&nbsp;<\/p>\n<p style=\"color: #000000; text-align: start;\" data-ke-size=\"size16\">\uadf8\ub798\uc11c \uc774\uc81c \ub098\ub984 \uc548\uc815\ud654\uac00 \ub418\uc5c8\uaca0\ub2e4 \uc2f6\uc5b4&hellip;! \uacf5\ubd80\ub97c \uc880 \ud574\ubcf4\ub824\uace0 \ud569\ub2c8\ub2e4.<\/p>\n<p style=\"color: #000000; text-align: start;\" data-ke-size=\"size16\">\uc77c\ub2e8 \uc774\ub807\uac8c \uc0d8\ud50c \ud504\ub85c\uc81d\ud2b8\ub97c \ub9cc\ub4e4\uc5b4\uc8fc\uace0,,<\/p>\n<p><figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-origin-width=\"1800\" data-origin-height=\"1286\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/PxM2Q\/btsBaXANZNm\/kvE2n2TbXRM1EWcifWrHc0\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/PxM2Q\/btsBaXANZNm\/kvE2n2TbXRM1EWcifWrHc0\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/PxM2Q\/btsBaXANZNm\/kvE2n2TbXRM1EWcifWrHc0\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPxM2Q%2FbtsBaXANZNm%2FkvE2n2TbXRM1EWcifWrHc0%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"548\" height=\"392\" data-origin-width=\"1800\" data-origin-height=\"1286\"\/><\/span><\/figure>\n<\/p>\n<p style=\"color: #000000; text-align: start;\" data-ke-size=\"size16\">\uc774\ub807\uac8c \ud3f4\ub354\uc640 \uac01\uc885 \ud30c\uc77c\ub4e4\uc774 \uc0dd\uae34 \uac78 \uc54c \uc218 \uc788\uc5b4\uc694.<\/p>\n<p><figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-origin-width=\"1800\" data-origin-height=\"1867\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/RNMs4\/btsBcY6F6So\/HHGo4Gkv5sHPt1QkzmVIOK\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/RNMs4\/btsBcY6F6So\/HHGo4Gkv5sHPt1QkzmVIOK\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/RNMs4\/btsBcY6F6So\/HHGo4Gkv5sHPt1QkzmVIOK\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRNMs4%2FbtsBcY6F6So%2FHHGo4Gkv5sHPt1QkzmVIOK%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"401\" height=\"416\" data-origin-width=\"1800\" data-origin-height=\"1867\"\/><\/span><\/figure>\n<\/p>\n<p style=\"color: #000000; text-align: start;\" data-ke-size=\"size16\">\uc5ec\uae30\uc11c AppDelegate\uc640 SceneDelegate\uac00 \uc5b4\ub514\uac14\ub098 \ud574\uc11c \ubd24\ub354\ub2c8&hellip; App\uc774\ub77c\ub294 \ud30c\uc77c\uc774 \uc874\uc7ac\ud558\ub294 \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<p style=\"color: #000000; text-align: start;\" data-ke-size=\"size16\"><s>\uc81c\uac00 \ud504\ub85c\uc81d\ud2b8 \uba85\uc744 SwiftUISampleApp\uc774\ub77c\uace0 \uc9c0\uc5c8\ub354\ub2c8 AppApp\uc774 \ub418\uc5c8\ub124\uc694  <\/s><\/p>\n<p style=\"color: #000000; text-align: start;\" data-ke-size=\"size16\">SwiftUI\ub294 \uc774\ub7f0\uc2dd\uc73c\ub85c Scene\ub4e4\uc744 body\ub77c\ub294 \uac83\uc5d0 \ub123\uc5b4 \uad00\ub9ac\ud558\ub098 \ubd05\ub2c8\ub2e4.<\/p>\n<p><figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-origin-width=\"1800\" data-origin-height=\"1431\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/dbnps6\/btsBgdaN9zC\/JryGTH0mKNUx8TAK6kTgT1\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/dbnps6\/btsBgdaN9zC\/JryGTH0mKNUx8TAK6kTgT1\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/dbnps6\/btsBgdaN9zC\/JryGTH0mKNUx8TAK6kTgT1\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdbnps6%2FbtsBgdaN9zC%2FJryGTH0mKNUx8TAK6kTgT1%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"477\" height=\"379\" data-origin-width=\"1800\" data-origin-height=\"1431\"\/><\/span><\/figure>\n<\/p>\n<p style=\"color: #000000; text-align: start;\" data-ke-size=\"size16\">\uadf8 \ub2e4\uc74c\uc73c\ub85c \uc0b4\ud3b4\ubcfc \uac83\uc740 ContentView\uc600\ub294\ub370, \uae30\uc874 UIKit\uacfc\ub294 \ube44\uad50\ub3c4 \uc548 \ub420 \uc815\ub3c4\ub85c \uac04\uacb0\ud55c \uac83\uc744 \uc0b4\ud3b4\ubcfc \uc218 \uc788\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<p style=\"color: #000000; text-align: start;\" data-ke-size=\"size16\">\uc2e0\uc120\ud55c \ucda9\uaca9\uc744 \ubc1b\uc744 \uc218 \uc788\uc5c8\uc5b4\uc694.<\/p>\n<p><figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-origin-width=\"1800\" data-origin-height=\"1528\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/bavSDt\/btsBb55ZUGP\/i2ooqnyryFSidmgeHc6Cm0\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/bavSDt\/btsBb55ZUGP\/i2ooqnyryFSidmgeHc6Cm0\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/bavSDt\/btsBb55ZUGP\/i2ooqnyryFSidmgeHc6Cm0\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbavSDt%2FbtsBb55ZUGP%2Fi2ooqnyryFSidmgeHc6Cm0%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"772\" height=\"655\" data-origin-width=\"1800\" data-origin-height=\"1528\"\/><\/span><\/figure>\n<\/p>\n<p style=\"color: #000000; text-align: start;\" data-ke-size=\"size16\">\uadf8\ub9ac\uace0 #Preview? \uc694\uac8c \ubb50\uc9c0 \uc2f6\uc5b4\uc11c \ucc3e\uc544\ubcf4\ub2c8, Xcode 15\ubd80\ud130 \ucd94\uac00\ub41c \uae30\ub2a5\uc778 \uac83 \uac19\ub354\ub77c\uad6c\uc694.<\/p>\n<p style=\"color: #000000; text-align: start;\" data-ke-size=\"size16\">Swift\uc758 \uae30\ub2a5\uc778 marco\ub97c \uc0ac\uc6a9\ud558\ub294 \uae30\ubcf8 \uae30\ub2a5\uc774 \ub418\uc5c8\ub124\uc694.<\/p>\n<p style=\"color: #000000; text-align: start;\" data-ke-size=\"size16\">\uc608\uc804\uc5d4 \ud504\ub9ac\ubdf0\ub97c \ub098\ud0c0\ub0b4\uae30 \uc704\ud574\uc11c\ub294 \ud55c\ucc38 \uae38\uac8c \uc37c\uc5b4\uc57c \ud588\ub294\ub370 \ub9d0\uc774\uc8e0.<\/p>\n<p style=\"color: #000000; text-align: start;\" data-ke-size=\"size16\">\uacf5\uc2dd\ubb38\uc11c : <a href=\"https:\/\/developer.apple.com\/documentation\/swiftui\/previews-in-xcode\">Previews in Xcode | Apple Developer Documentation<\/a><\/p>\n<figure id=\"og_1701336707110\" contenteditable=\"false\" data-ke-type=\"opengraph\" data-ke-align=\"alignCenter\" data-og-type=\"website\" data-og-title=\"Previews in Xcode | Apple Developer Documentation\" data-og-description=\"Generate dynamic, interactive previews of your custom views.\" data-og-host=\"developer.apple.com\" data-og-source-url=\"https:\/\/developer.apple.com\/documentation\/swiftui\/previews-in-xcode\" data-og-url=\"https:\/\/docs.developer.apple.com\/documentation\/swiftui\/previews-in-xcode\" data-og-image=\"https:\/\/scrap.kakaocdn.net\/dn\/bud5n6\/hyUE7JNAOr\/G1fLMnogkimj2SF9xSeccK\/img.jpg?width=1200&amp;height=630&amp;face=0_0_1200_630,https:\/\/scrap.kakaocdn.net\/dn\/2g4oU\/hyUE8aSklk\/K3hIoNiBWYeQWbnBvmcLEk\/img.jpg?width=1024&amp;height=512&amp;face=0_0_1024_512\"><a href=\"https:\/\/developer.apple.com\/documentation\/swiftui\/previews-in-xcode\" target=\"_blank\" rel=\"noopener\" data-source-url=\"https:\/\/developer.apple.com\/documentation\/swiftui\/previews-in-xcode\">\n<div class=\"og-image\" style=\"background-image: url('https:\/\/scrap.kakaocdn.net\/dn\/bud5n6\/hyUE7JNAOr\/G1fLMnogkimj2SF9xSeccK\/img.jpg?width=1200&amp;height=630&amp;face=0_0_1200_630,https:\/\/scrap.kakaocdn.net\/dn\/2g4oU\/hyUE8aSklk\/K3hIoNiBWYeQWbnBvmcLEk\/img.jpg?width=1024&amp;height=512&amp;face=0_0_1024_512');\">&nbsp;<\/div>\n<div class=\"og-text\">\n<p class=\"og-title\" data-ke-size=\"size16\">Previews in Xcode | Apple Developer Documentation<\/p>\n<p class=\"og-desc\" data-ke-size=\"size16\">Generate dynamic, interactive previews of your custom views.<\/p>\n<p class=\"og-host\" data-ke-size=\"size16\">developer.apple.com<\/p>\n<\/div>\n<\/a><\/figure>\n<p style=\"color: #000000; text-align: start;\" data-ke-size=\"size16\">&nbsp;<\/p>\n<p style=\"color: #000000; text-align: start;\" data-ke-size=\"size16\">\uadf8\ub9ac\uace0 \uc815\ub9d0 \ub05d\uc785\ub2c8\ub2e4!<\/p>\n<p style=\"color: #000000; text-align: start;\" data-ke-size=\"size16\">\ub124 \ub2e4 \ubd24\uc5b4\uc694. \uc815\ub9d0 \uc2e0\uae30\ud558\ub354\ub77c\uad6c\uc694. \uc774\uac8c \uc815\ub9d0 \ub9d0\uc774\ub418\ub098 \uc2f6\uc744 \uc815\ub3c4\ub85c \uac70\ucd94\uc7a5\uc2a4\ub7ec\uc6b4 \uac83\ub4e4\uc774 \uc2f9 \uc0ac\ub77c\uc9c4, \uc544\ub984\ub2e4\uc6b4 \ubb38\ubc95\uc744 \uc9c0\ud5a5\ud558\ub294 \uac83 \uac19\uc544\uc694. &nbsp;\uc55e\uc73c\ub85c \ub354 \ubc30\uc6cc\ub098\uac00\uc57c \ud560 \uac83\ub4e4\uc774 \ub9ce\uc544\ubcf4\uc774\uae34 \ud558\uc9c0\ub9cc, \uccab \uc778\uc0c1\uc73c\ub85c \ubd24\uc744 \ub550 \uc815\ub9d0 \uc88b\uc544\ubcf4\uc5ec\uc694.<\/p>\n<p style=\"color: #000000; text-align: start;\" data-ke-size=\"size16\">&nbsp;<\/p>\n<p style=\"color: #000000; text-align: start;\" data-ke-size=\"size16\">\uc77c\ub2e8 \uae30\ubcf8\uae30\ubd80\ud130 \uacf5\ubd80\ud574\uc57c \ud558\uc9c0 \uc54a\uc744\uae4c \uc2f6\uc5b4, \ubb38\ub4dd @main\uacfc App\uc5d0 \ub300\ud574 \uc11c\uc220\ud574\ubcf4\ub824\uace0 \ud588\uc73c\ub098 \uc8fc\uc81c\uc5d0 \ubc97\uc5b4\ub09c \uac83 \uac19\uc544 \ub2e4\ub978 \uae00\ub85c \uc900\ube44\ud574\ubcf4\ub824\uace0 \ud574\uc694. UI\ub97c \uadf8\ub9ac\ub294 \ubc29\ubc95\ubd80\ud130 \uc2dc\uc791\ud574\uc11c \ud654\uba74\uc5d0 \uc5b4\ub5bb\uac8c \ub098\uc624\ub294\uc9c0\uae4c\uc9c0\ub3c4 \ub9ce\uc774 \ub2ec\ub77c\uc84c\uc744 \uac83 \uac19\uc544 \uc801\uc744 \uae00\uc774 \uc815\ub9d0 \ub9ce\uc544\ubcf4\uc774\uc9c0\ub9cc, \uc5f4\uc2ec\ud788 \uc900\ube44\ud574\ubcf4\uaca0\uc2b5\ub2c8\ub2e4!!<\/p>\n<p style=\"color: #000000; text-align: start;\" data-ke-size=\"size16\">&nbsp;<\/p>\n<p style=\"color: #000000; text-align: start;\" data-ke-size=\"size16\">\ud639\uc2dc \uae00\uc758 \uc815\ubcf4\uac00 \uc798\ubabb\ub41c \uac8c \uc788\uac70\ub098 \ubcf4\uc644\ud560 \uc810\uc774 \uc788\ub2e4\uba74 \uc5b8\uc81c\ub4e0\uc9c0 \ub2f5\uae00 \ub0a8\uaca8\uc8fc\uc138\uc694!<\/p>\n<p style=\"color: #000000; text-align: start;\" data-ke-size=\"size16\">\ubd80\uc871\ud55c \uae00\uc774\uc9c0\ub9cc \uc77d\uc5b4\uc8fc\uc154\uc11c \uac10\uc0ac\ud569\ub2c8\ub2e4.  &zwj;\u2642\ufe0f<\/p>","category":"iOS \ud504\ub808\uc784\uc6cc\ud06c","author":"Skyline-23","guid":"https:\/\/ios-dev-skyline-23.tistory.com\/30","comments":"https:\/\/ios-dev-skyline-23.tistory.com\/30#entry30comment","pubDate":"Thu, 30 Nov 2023 18:34:49 +0900"},{"title":"NSLock","link":"https:\/\/ios-dev-skyline-23.tistory.com\/29","description":"<p><figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-origin-width=\"1920\" data-origin-height=\"1080\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/cBZvwJ\/btrC6IG6ZGH\/OlsaANivUKOcJGxAmYOebK\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/cBZvwJ\/btrC6IG6ZGH\/OlsaANivUKOcJGxAmYOebK\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/cBZvwJ\/btrC6IG6ZGH\/OlsaANivUKOcJGxAmYOebK\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBZvwJ%2FbtrC6IG6ZGH%2FOlsaANivUKOcJGxAmYOebK%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"1920\" height=\"1080\" data-origin-width=\"1920\" data-origin-height=\"1080\"\/><\/span><\/figure>\n<\/p>\n<h2 data-ke-size=\"size26\">0. \uac1c\ubc1c\uc790 \ubb38\uc11c \ud655\uc778<\/h2>\n<p data-ke-size=\"size16\">\uba3c\uc800 \uc54c\uc544\ubcf4\uae30 \uc804\uc5d0 NSLock\uc5d0 \uad00\ud55c \uc124\uba85\uc744 \uc560\ud50c\uc758 \uac1c\ubc1c\uc790 \ubb38\uc11c\uc5d0\uc11c \uba3c\uc800 \ucc3e\uc544\ubcf4\uc558\ub2e4.<\/p>\n<p data-ke-size=\"size16\"><a href=\"https:\/\/developer.apple.com\/documentation\/foundation\/nslock\">https:\/\/developer.apple.com\/documentation\/foundation\/nslock<\/a><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size18\"><b>An object that coordinates the operation of multiple threads of execution within the same application.<\/b><\/p>\n<p data-ke-size=\"size18\"><b>&ldquo;\ub3d9\uc77c\ud55c \uc5b4\ud50c\ub9ac\ucf00\uc774\uc158 \ub0b4\uc5d0\uc11c \uc5ec\ub7ec \uc2a4\ub808\ub4dc\ub97c \uc870\uc815\ud558\ub294 \uac1d\uccb4&rdquo; \ub77c\uace0 \ub098\uc640 \uc788\uc5c8\ub2e4.<\/b><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h2 data-ke-size=\"size26\">1. Thread-Safe\ub97c \uc9c0\ud0a4\ub294 \ubc29\ubc95<\/h2>\n<ul style=\"list-style-type: disc;\" data-ke-list-type=\"disc\">\n<li>Re-entrancy\n<ul style=\"list-style-type: disc;\" data-ke-list-type=\"disc\">\n<li>\uc5b4\ub5a4 \ud568\uc218\uac00 \ud55c \uc2a4\ub808\ub4dc\uc5d0 \uc758\ud574 \ud638\ucd9c\ub418\uc5b4 \uc2e4\ud589 \uc911\uc77c \ub54c, \ub2e4\ub978 \uc2a4\ub808\ub4dc\uc5d0\uc11c \ud568\uc218\uac00 \ud638\ucd9c\ub418\ub354\ub77c\ub3c4 \uc62c\ubc14\ub974\uac8c \uc8fc\uc5b4\uc838\uc57c\ud568<\/li>\n<\/ul>\n<\/li>\n<li>Thread-local storage\n<ul style=\"list-style-type: disc;\" data-ke-list-type=\"disc\">\n<li>\uacf5\uc720 \uc790\uc6d0\uc744 \uc904\uc5ec \uac01 \uc2a4\ub808\ub4dc\uc5d0\uc11c\ub9cc \uc811\uadfc \uac00\ub2a5\ud55c \uc800\uc7a5\uc18c\ub4e4\uc744 \uc0ac\uc6a9\ud574 \ub3d9\uc2dc \uc811\uadfc\uc744 \ub9c9\uc74c<\/li>\n<\/ul>\n<\/li>\n<li>Mutual exclusion\n<ul style=\"list-style-type: disc;\" data-ke-list-type=\"disc\">\n<li>\uacf5\uc720 \uc790\uc6d0\uc744 \uaf2d \uc0ac\uc6a9\ud574\uc57c \ud560 \uacbd\uc6b0 semophore\ub4f1\uc758 lock\uc73c\ub85c \ud1b5\uc81c\ud558\uc5ec \ub2e4\ub978 \uc2a4\ub808\ub4dc\uac00 \uc811\uadfc\ud558\uc9c0 \ubabb\ud558\uac8c \ud568. \uc784\uacc4 \uc601\uc5ed \uc548\uc5d0\uc11c \ud55c\uac00\uc9c0 \uc2a4\ub808\ub4dc\ub9cc \uc811\uadfc<\/li>\n<\/ul>\n<\/li>\n<li>Atomic operations\n<ul style=\"list-style-type: disc;\" data-ke-list-type=\"disc\">\n<li>\uacf5\uc720 \uc790\uc6d0\uc5d0 \uc811\uadfc\ud560 \ub54c \uc6d0\uc790 \uc5f0\uc0b0\uc744 \uc774\uc6a9\ud558\uac70\ub098 \uc6d0\uc790\uc801\uc73c\ub85c \uc815\uc758\ub41c \uc811\uadfc \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud568.<\/li>\n<li>\uc811\uadfc \uc21c\uc11c\ub97c \uc758\ub3c4\uc801 \ub610\ub294 \ube44 \uc758\ub3c4\uc801\uc73c\ub85c \uc9c1\ub82c\ud654\ud558\uc5ec \uc758\ub3c4\uce58 \uc54a\ub294 \uacb0\uacfc\ub97c \ud53c\ud558\ub294 \uc5f0\uc0b0 \ubc29\uc2dd.<span style=\"letter-spacing: 0px;\">NSLock \uac1d\uccb4\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \uae00\ub85c\ubc8c \ub370\uc774\ud130\uc5d0 \ub300\ud55c \uc561\uc138\uc2a4\ub97c \uc911\uc7ac\ud558\uac70\ub098 \uc911\uc694\ud55c \ucf54\ub4dc \uc139\uc158\uc744 \ubcf4\ud638\ud558\uc5ec \uc6d0\uc790\uc801\uc73c\ub85c \uc2e4\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p data-ke-size=\"size16\">NSLock\uc744 \uc0ac\uc6a9\ud558\uba74 Thread-Safe\ud558\uac8c \ub9cc\ub4dc\ub294 \ubc29\ubc95 \uc911 \ud558\ub098\uc778 atomic\ud558\uac8c \uc2e4\ud589\ud558\ub294 \uc870\uac74\uc744 \ucda9\uc871\uc2dc\ud0ac \uc218 \uc788\ub2e4.<\/p>\n<hr contenteditable=\"false\" data-ke-type=\"horizontalRule\" data-ke-style=\"style2\" \/>\n<h4 data-ke-size=\"size20\"><span style=\"color: #ee2323;\"><b>\uc8fc\uc758<\/b><\/span><\/h4>\n<p data-ke-size=\"size16\"><b>\uc7a0\uae08\uc744 \ud55c \uac19\uc740 \uc2a4\ub808\ub4dc\uc5d0\uc11c \uc7a0\uae08\uc744 \ud574\uc81c\ud574\uc57c\ud568. \ub2e4\ub978 \uc2a4\ub808\ub4dc\uc5d0\uc11c \uc7a0\uae08\uc744 \ud574\uc81c\ud560 \uacbd\uc6b0 \uc6d0\ud558\ub294 \uacb0\uacfc\uac00 \ub098\uc624\uc9c0 \uc54a\uc744 \uc218 \uc788\uc74c.<\/b><\/p>\n<p data-ke-size=\"size16\"><b>\uac19\uc740 \uba54\uc11c\ub4dc\uc5d0\uc11c \uc7a0\uae08 \uba54\uc11c\ub4dc\ub97c \ub450\ubc88 \ud638\ucd9c\ud560 \uacbd\uc6b0 \uc2a4\ub808\ub4dc\uac00 \uc601\uad6c\uc801\uc73c\ub85c \uc7a0\uae30\uac8c \ub428.<\/b><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h2 data-ke-size=\"size26\">2. \uc608\uc2dc \ucf54\ub4dc<\/h2>\n<p><figure class=\"imageblock alignLeft\" data-ke-mobileStyle=\"widthOrigin\" data-origin-width=\"818\" data-origin-height=\"1034\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/CGbOe\/btrC4hjpAkA\/snAgPY9LKkRnwRCmqt7u4K\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/CGbOe\/btrC4hjpAkA\/snAgPY9LKkRnwRCmqt7u4K\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/CGbOe\/btrC4hjpAkA\/snAgPY9LKkRnwRCmqt7u4K\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCGbOe%2FbtrC4hjpAkA%2FsnAgPY9LKkRnwRCmqt7u4K%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"400\" height=\"506\" data-origin-width=\"818\" data-origin-height=\"1034\"\/><\/span><\/figure>\n<\/p>\n<p data-ke-size=\"size16\">calculate \uba54\uc11c\ub4dc\uc5d0 \uc811\uadfc\ud560 \ub54c lock\uc744 \ud55c\ud6c4 calculate\uac00 \ub05d\ub098\uae30 \uc9c1\uc804 lock\uc744 \ud480\uc5b4\uc8fc\ub294 \ucf54\ub4dc\uc774\ub2e4.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">Thread 1\uc5d0\uc11c calcuate \uba54\uc11c\ub4dc \uc2e4\ud589\uacfc \uc7a0\uae08 &rarr; Thread 2\uc5d0\uc11c calcuate \uba54\uc11c\ub4dc \uc2e4\ud589 \ub300\uae30 &rarr; Thread 1\uc5d0\uc11c calculate \uc2e4\ud589 \ud6c4 \uc7a0\uae08 \ud574\uc81c &rarr; Thread 2\uc5d0\uc11c calcuate \uba54\uc11c\ub4dc \uc2e4\ud589\uacfc \uc7a0\uae08 &rarr; Thread 2\uc5d0\uc11c calculate \uc2e4\ud589 \ud6c4 \uc7a0\uae08 \ud574\uc81c<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">\uc774\ub807\uac8c \uc9c1\ub82c\ud654\ud558\uc5ec \uc21c\ucc28\uc801\uc73c\ub85c \uacc4\uc0b0\ud558\uac8c \ub41c\ub2e4\uba74 \uc758\ub3c4\uce58 \uc54a\uc740 \uacb0\uacfc\uac00 \ub098\uc624\ub294 \uac83\uc744 \ud53c\ud560 \uc218 \uc788\ub2e4.<\/p>","category":["iOS \ud504\ub808\uc784\uc6cc\ud06c","atomic operations","defer","ios","multi-thread","NSLock","swift","Thread","Thread-safe"],"author":"Skyline-23","guid":"https:\/\/ios-dev-skyline-23.tistory.com\/29","comments":"https:\/\/ios-dev-skyline-23.tistory.com\/29#entry29comment","pubDate":"Wed, 25 May 2022 10:37:13 +0900"},{"title":"Core Animation Pipeline","link":"https:\/\/ios-dev-skyline-23.tistory.com\/28","description":"<p><figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-origin-width=\"1920\" data-origin-height=\"1080\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/cjS7PL\/btrC2Zv4D6H\/ySiKe7PG9n8VVxJeUROHbK\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/cjS7PL\/btrC2Zv4D6H\/ySiKe7PG9n8VVxJeUROHbK\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/cjS7PL\/btrC2Zv4D6H\/ySiKe7PG9n8VVxJeUROHbK\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjS7PL%2FbtrC2Zv4D6H%2FySiKe7PG9n8VVxJeUROHbK%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"1920\" height=\"1080\" data-origin-width=\"1920\" data-origin-height=\"1080\"\/><\/span><\/figure>\n<figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-origin-width=\"943\" data-origin-height=\"585\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/blonSf\/btrC0NYg5mP\/iDT0NCpX3CX40t8izqxNV1\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/blonSf\/btrC0NYg5mP\/iDT0NCpX3CX40t8izqxNV1\/img.png\" data-alt=\"WWDC 2014 - Advanced Graphics and Animations for iOS Apps\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/blonSf\/btrC0NYg5mP\/iDT0NCpX3CX40t8izqxNV1\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblonSf%2FbtrC0NYg5mP%2FiDT0NCpX3CX40t8izqxNV1%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"943\" height=\"585\" data-origin-width=\"943\" data-origin-height=\"585\"\/><\/span><figcaption>WWDC 2014 - Advanced Graphics and Animations for iOS Apps<\/figcaption>\n<\/figure>\n<\/p>\n<h2 data-ke-size=\"size26\">Commit Transaction<\/h2>\n<ul style=\"list-style-type: disc;\" data-ke-list-type=\"disc\">\n<li>Layout \ub2e8\uacc4: \ub808\uc774\uc5b4 \uc815\ub82c \ubc0f \uc704\uce58\uc640 \uc0c9\uc0c1\uc744 \uc815\uc758 (layoutSubviews\ub97c \ud638\ucd9c)<\/li>\n<li>Display: draw\uba54\uc11c\ub4dc\ub4e4\uc774 \uc811\uadfc\ud558\ub294 \ub2e8\uacc4. \uac1c\ubc1c\uc790\ub4e4\uc740 \uc9c1\uc811 \ud638\ucd9c\uc744 \ubabb\ud558\uba70 setNeedsDisplay\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc811\uadfc\ud574\uc57c \ud55c\ub2e4.<\/li>\n<li>Prepare: Core Animation\uc774 context\ub97c \ub0b4\ubcf4\ub0b4\ub824\uace0 \ud560 \ub54c image decoding\uacfc \uac19\uc740 \uc791\uc5c5\uc744 \uc9c4\ud589\ud55c\ub2e4.<\/li>\n<li>Commit: Core Animation\uc774 layer\ub4e4\uc744 \ud328\ud0a4\uc9d5\ud558\uc5ec Render Server\ub85c \uc804\uc1a1\ud55c\ub2e4.<\/li>\n<\/ul>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h2 data-ke-size=\"size26\">Render Server<\/h2>\n<p data-ke-size=\"size16\">Commit Transaction\uc5d0\uc11c \ubc1b\uc740 \ud328\ud0a4\uc9c0\ub4e4\uc744 \ub2e4\uc2dc \ubd84\uc11d\ud558\uace0 \ub80c\ub354\ub9c1 \ud2b8\ub9ac\ub85c deserialization \ud55c\ub2e4.<\/p>\n<p data-ke-size=\"size16\">drawing instruction\uc744 \uc0dd\uc131\ud558\uace0 VSync Signal\uc5d0 \ub9de\ucdb0 \ud654\uba74\uc744 \ub79c\ub354\ub9c1 \ud558\ub294 OpenGL\uc744 \ud638\ucd9c\ud55c\ub2e4<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">VSync Signal: \ud55c \ud504\ub808\uc784\uc774 \uc2dc\uc791\ub420 \ub54c \uc2dc\uc791 \uc9c0\uc810\uc744 \ub098\ud0c0\ub0b4\ub294 \uc2e0\ud638<\/p>\n<h2 data-ke-size=\"size26\">GPU<\/h2>\n<p data-ke-size=\"size16\">VSync Signal\uc5d0 \ub9de\ucdb0 OpenGL\uc744 \uc0ac\uc6a9\ud574 \ub79c\ub354\ub9c1\uc744 \uc2dc\uc791\ud55c\ub2e4.<\/p>\n<p data-ke-size=\"size16\">\ub79c\ub354\ub9c1\uc774 \ub05d\ub09c \uc774\ud6c4 Buffer\uc5d0\uac8c \uac12\uc744 \uc804\ub2ec\ud55c\ub2e4.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h2 data-ke-size=\"size26\">Display<\/h2>\n<p data-ke-size=\"size16\">GPU\uc5d0\uc11c \ucc98\ub9ac\ub41c \uac12\uc744 Buffer\ub85c\ubd80\ud130 \ubc1b\uc544 \ud654\uba74\uc5d0 \ub744\uc6cc\uc900\ub2e4.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">\uc704 \ud30c\uc774\ud504\ub77c\uc778 \uacfc\uc815\uc740 1\ucd08\ub2f9 60\ubc88 \uc774\ub8e8\uc5b4\uc9c4\ub2e4.<\/p>\n<p data-ke-size=\"size16\">\ub9cc\uc57d \ubc31\uadf8\ub77c\uc6b4\ub4dc \uc2a4\ub808\ub4dc\uc5d0\uc11c view\ub97c \ubcc0\uacbd\ud560 \uacbd\uc6b0 \uc5ec\ub7ec \uc2a4\ub808\ub4dc\uc5d0\uc11c \uc704 \ud30c\uc774\ud504\ub77c\uc778\uc744 \ud1b5\ud574 \ubdf0\ub97c \uc5c5\ub370\uc774\ud2b8\ud560 \uac83\uc774\uace0, \uc704 \uc791\uc5c5\uc740 \ub9e4\uc6b0 \ubb34\uac70\uc6b4 \uc791\uc5c5\uc774\uae30\uc5d0 \uc131\ub2a5\uc5d0 \uc9c1\uc811\uc801\uc778 \uc601\ud5a5\uc744 \ub07c\uce60 \uc218 \uc788\uc5b4 \uc720\uc758\ud574\uc57c \ud55c\ub2e4.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">\uadf8\ub798\uc11c UI \uc5c5\ub370\uc774\ud2b8\ub294 \uba54\uc778 \uc2a4\ub808\ub4dc\uc5d0\uc11c\ub9cc \uc774\ub8e8\uc5b4\uc838\uc57c \ud55c\ub2e4.<\/p>\n<p data-ke-size=\"size16\">\ucc38\uace0 : <a href=\"https:\/\/ios-dev-skyline-23.tistory.com\/entry\/UI\uc791\uc5c5\uc774-main-thread\uc5d0\uc11c-\uc774\ub904\uc838\uc57c\ud558\ub294-\uc774\uc720\" target=\"_blank\" rel=\"noopener\">https:\/\/ios-dev-skyline-23.tistory.com\/entry\/UI\uc791\uc5c5\uc774-main-thread\uc5d0\uc11c-\uc774\ub904\uc838\uc57c\ud558\ub294-\uc774\uc720<\/a><\/p>\n<figure id=\"og_1653397126437\" contenteditable=\"false\" data-ke-type=\"opengraph\" data-ke-align=\"alignCenter\" data-og-type=\"article\" data-og-title=\"UI\uc791\uc5c5\uc774 Main Thread\uc5d0\uc11c \uc774\ub904\uc838\uc57c \ud558\ub294 \uc774\uc720\" data-og-description=\"iOS\uc5d0\uc11c \uac1c\ubc1c\uc744 \uc9c4\ud589\ud558\ub2e4 \ubcf4\uba74, UI \uc5c5\ub370\uc774\ud2b8\uc640 \uad00\ub828\ub41c \ubaa8\ub4e0 \uc791\uc5c5\uc740 main thread\uc5d0\uc11c \uc791\uc5c5\uc744 \ud574\uc57c \ud55c\ub2e4\ub294 \uac78 \ub9ce\uc774 \ub9c8\uc8fc\uce58\uac8c \ub420 \uac83\uc774\ub2e4. \ud56d\uc0c1 \uc774\uc5d0 \uad00\ud55c \uc815\ud655\ud55c \uc774\uc720\ub97c \ubaa8\ub974\uace0 \ub118\uacbc\uc9c0\ub9cc \uc774\ubc88 \uae30\ud68c\uc5d0 \uc774\" data-og-host=\"ios-dev-skyline-23.tistory.com\" data-og-source-url=\"https:\/\/ios-dev-skyline-23.tistory.com\/entry\/UI\uc791\uc5c5\uc774-main-thread\uc5d0\uc11c-\uc774\ub904\uc838\uc57c\ud558\ub294-\uc774\uc720\" data-og-url=\"https:\/\/ios-dev-skyline-23.tistory.com\/entry\/UI%EC%9E%91%EC%97%85%EC%9D%B4-main-thread%EC%97%90%EC%84%9C-%EC%9D%B4%EB%A4%84%EC%A0%B8%EC%95%BC%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0\" data-og-image=\"https:\/\/scrap.kakaocdn.net\/dn\/bA10kG\/hyOvKHUHzG\/7KIgWKKmiKq5jwdYOiETYK\/img.png?width=800&amp;height=450&amp;face=0_0_800_450,https:\/\/scrap.kakaocdn.net\/dn\/ezeCX\/hyOvMTgdTr\/UqkELIDxrKWb07EIcG2jW1\/img.png?width=800&amp;height=450&amp;face=0_0_800_450,https:\/\/scrap.kakaocdn.net\/dn\/bxjKgZ\/hyOxrNtOTS\/2LRnmUVC1LFhWTEvmZT8EK\/img.png?width=1920&amp;height=1080&amp;face=0_0_1920_1080\"><a href=\"https:\/\/ios-dev-skyline-23.tistory.com\/entry\/UI\uc791\uc5c5\uc774-main-thread\uc5d0\uc11c-\uc774\ub904\uc838\uc57c\ud558\ub294-\uc774\uc720\" target=\"_blank\" rel=\"noopener\" data-source-url=\"https:\/\/ios-dev-skyline-23.tistory.com\/entry\/UI\uc791\uc5c5\uc774-main-thread\uc5d0\uc11c-\uc774\ub904\uc838\uc57c\ud558\ub294-\uc774\uc720\">\n<div class=\"og-image\" style=\"background-image: url('https:\/\/scrap.kakaocdn.net\/dn\/bA10kG\/hyOvKHUHzG\/7KIgWKKmiKq5jwdYOiETYK\/img.png?width=800&amp;height=450&amp;face=0_0_800_450,https:\/\/scrap.kakaocdn.net\/dn\/ezeCX\/hyOvMTgdTr\/UqkELIDxrKWb07EIcG2jW1\/img.png?width=800&amp;height=450&amp;face=0_0_800_450,https:\/\/scrap.kakaocdn.net\/dn\/bxjKgZ\/hyOxrNtOTS\/2LRnmUVC1LFhWTEvmZT8EK\/img.png?width=1920&amp;height=1080&amp;face=0_0_1920_1080');\">&nbsp;<\/div>\n<div class=\"og-text\">\n<p class=\"og-title\" data-ke-size=\"size16\">UI\uc791\uc5c5\uc774 Main Thread\uc5d0\uc11c \uc774\ub904\uc838\uc57c \ud558\ub294 \uc774\uc720<\/p>\n<p class=\"og-desc\" data-ke-size=\"size16\">iOS\uc5d0\uc11c \uac1c\ubc1c\uc744 \uc9c4\ud589\ud558\ub2e4 \ubcf4\uba74, UI \uc5c5\ub370\uc774\ud2b8\uc640 \uad00\ub828\ub41c \ubaa8\ub4e0 \uc791\uc5c5\uc740 main thread\uc5d0\uc11c \uc791\uc5c5\uc744 \ud574\uc57c \ud55c\ub2e4\ub294 \uac78 \ub9ce\uc774 \ub9c8\uc8fc\uce58\uac8c \ub420 \uac83\uc774\ub2e4. \ud56d\uc0c1 \uc774\uc5d0 \uad00\ud55c \uc815\ud655\ud55c \uc774\uc720\ub97c \ubaa8\ub974\uace0 \ub118\uacbc\uc9c0\ub9cc \uc774\ubc88 \uae30\ud68c\uc5d0 \uc774<\/p>\n<p class=\"og-host\" data-ke-size=\"size16\">ios-dev-skyline-23.tistory.com<\/p>\n<\/div>\n<\/a><\/figure>\n<p data-ke-size=\"size16\">&nbsp;<\/p>","category":"iOS \ud504\ub808\uc784\uc6cc\ud06c","author":"Skyline-23","guid":"https:\/\/ios-dev-skyline-23.tistory.com\/28","comments":"https:\/\/ios-dev-skyline-23.tistory.com\/28#entry28comment","pubDate":"Tue, 24 May 2022 21:59:31 +0900"},{"title":"defer","link":"https:\/\/ios-dev-skyline-23.tistory.com\/27","description":"<p><figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-origin-width=\"1920\" data-origin-height=\"1080\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/ODXzG\/btrC3dgJB2d\/lTx8IFLNUsz52GoOMlK5t0\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/ODXzG\/btrC3dgJB2d\/lTx8IFLNUsz52GoOMlK5t0\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/ODXzG\/btrC3dgJB2d\/lTx8IFLNUsz52GoOMlK5t0\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FODXzG%2FbtrC3dgJB2d%2FlTx8IFLNUsz52GoOMlK5t0%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"1920\" height=\"1080\" data-origin-width=\"1920\" data-origin-height=\"1080\"\/><\/span><\/figure>\n<\/p>\n<p data-ke-size=\"size16\">Swift\ub97c \uc0ac\uc6a9\ud558\uba74\uc11c \uac70\uc758 \uc798 \ud65c\uc6a9\ud558\uc9c4 \uc54a\uc558\uc9c0\ub9cc, \uaf64\ub098 \ud765\ubbf8\ub86d\uac8c \ub2e4\uac00\uc640 \uc774 \ubb38\ubc95\uc744 \uc815\ub9ac\ud558\uac8c \ub418\uc5c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h2 data-ke-size=\"size26\">0. defer\ub780 \ubb34\uc5c7\uc778\uac00?<\/h2>\n<p data-ke-size=\"size16\">\ud604\uc7ac \uc2a4\ucf54\ud504\ub97c \ubc97\uc5b4\ub0a0 \uacbd\uc6b0 \uac00\uc7a5 \ub9c8\uc9c0\ub9c9\uc5d0 \uc2e4\ud589\uc774 \ub418\ub294 \uad6c\ubb38\uc774\ub2e4.<\/p>\n<p data-ke-size=\"size16\">\ucc98\uc74c \ubcf4\uba74 \uc774\ud574\uac00 \uc798 \uac00\uc9c0 \uc54a\uaca0\uc9c0\ub9cc \uc608\uc2dc\ub97c \uc774\ud574\ud558\ub2e4 \ubcf4\uba74 \uc0dd\uac01\ubcf4\ub2e4 \uae08\ubc29 \uc774\ud574\ud560 \uc218 \uc788\ub2e4.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h2 data-ke-size=\"size26\">1. defer \ud65c\uc6a9\ud574\ubcf4\uae30<\/h2>\n<p><figure class=\"imageblock alignLeft\" data-ke-mobileStyle=\"widthOrigin\" data-filename=\"Screen Shot 2022-05-24 at 2.34.37 PM.png\" data-origin-width=\"504\" data-origin-height=\"538\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/b5xeJB\/btrC2gxBscL\/K55wmRzqQLvkqreYiyRii0\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/b5xeJB\/btrC2gxBscL\/K55wmRzqQLvkqreYiyRii0\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/b5xeJB\/btrC2gxBscL\/K55wmRzqQLvkqreYiyRii0\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5xeJB%2FbtrC2gxBscL%2FK55wmRzqQLvkqreYiyRii0%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"280\" height=\"299\" data-filename=\"Screen Shot 2022-05-24 at 2.34.37 PM.png\" data-origin-width=\"504\" data-origin-height=\"538\"\/><\/span><\/figure>\n<\/p>\n<p data-ke-size=\"size16\">\uc704\uc640 \uac19\uc774 \uad6c\uc131\uc744 \ud55c \ud6c4 \uacb0\uacfc\ub97c \ucd9c\ub825\ud574\ubcf4\uc558\ub2e4.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">\uadf8\ub7ac\ub354\ub2c8 <b>b, a, c<\/b> \uc21c\uc11c\ub300\ub85c \ucd9c\ub825\uc774 \ub418\ub294 \uac83\uc744 \ud655\uc778 \ud560 \uc218 \uc788\uc5c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">\uac04\ub2e8\ud558\uac8c \uc124\uba85\ud558\uc790\uba74 defer\ub294 \ud568\uc218\uc758 \uac00\uc7a5 \ub9c8\uc9c0\ub9c9\uc5d0 \uc2e4\ud589\uc774 \ub41c\ub2e4\ub294 \uac83\uc744 <b>\ubcf4\uc7a5<\/b>\ud558\ub294 \uac83\uc774\ub2e4.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h2 data-ke-size=\"size26\">1-1. defer \uc5ec\ub7ec\uac1c \uc4f0\uae30<\/h2>\n<p data-ke-size=\"size16\">\uadf8\ub807\ub2e4\uba74 defer\ub97c \uc5ec\ub7ec\uac1c\ub85c \uc4f0\uac8c \ub41c\ub2e4\uba74 \uc5b4\ub5bb\uac8c \ub420\uae4c?<\/p>\n<p><figure class=\"imageblock alignLeft\" data-ke-mobileStyle=\"widthOrigin\" data-filename=\"Screen Shot 2022-05-24 at 7.34.53 PM.png\" data-origin-width=\"448\" data-origin-height=\"400\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/buibNH\/btrC3emmOzt\/yI9LXkerkzzs1uf4mcUTDK\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/buibNH\/btrC3emmOzt\/yI9LXkerkzzs1uf4mcUTDK\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/buibNH\/btrC3emmOzt\/yI9LXkerkzzs1uf4mcUTDK\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuibNH%2FbtrC3emmOzt%2FyI9LXkerkzzs1uf4mcUTDK%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"280\" height=\"250\" data-filename=\"Screen Shot 2022-05-24 at 7.34.53 PM.png\" data-origin-width=\"448\" data-origin-height=\"400\"\/><\/span><\/figure>\n<\/p>\n<p data-ke-size=\"size16\">\uc774\ub807\uac8c defer\ub97c \uc5ec\ub7ec\uac1c \uc4f0\uac8c \ub41c\ub2e4\uba74 <b>2, 1<\/b> \uc21c\uc11c\ub85c \ucd9c\ub825\ub41c\ub2e4.<\/p>\n<p data-ke-size=\"size16\">defer\ub294 \uc2a4\ud0dd\uc758 \ud615\uc2dd\uc73c\ub85c \uc0ac\uc6a9\ub418\uba70 \ub098\uc911\uc5d0 \ub4e4\uc5b4\uac04 \uac83\uc774 \uba3c\uc800 \ucd9c\ub825\ub418\ub294 \uac83\uc774\ub2e4.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h2 data-ke-size=\"size26\">1-2. defer\uc758 \uc2e4\ud589<\/h2>\n<p data-ke-size=\"size16\">\ud2b9\uc774\ud55c \uc810\uc774\ub77c\uba74 defer\ub97c \uc77d\uae30 \uc804\uc5d0 \uc885\ub8cc\ub41c\ub2e4\uba74 \uc2e4\ud589\ub418\uc9c0 \uc54a\ub294\ub2e4\ub294 \uac83\uc774\ub2e4.<\/p>\n<p><figure class=\"imageblock alignLeft\" data-ke-mobileStyle=\"widthOrigin\" data-filename=\"Screen Shot 2022-05-24 at 7.44.11 PM.png\" data-origin-width=\"402\" data-origin-height=\"464\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/czIpfv\/btrC2KTlwmb\/1z6Fviukz3nNYrKtFpb5q1\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/czIpfv\/btrC2KTlwmb\/1z6Fviukz3nNYrKtFpb5q1\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/czIpfv\/btrC2KTlwmb\/1z6Fviukz3nNYrKtFpb5q1\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczIpfv%2FbtrC2KTlwmb%2F1z6Fviukz3nNYrKtFpb5q1%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"280\" height=\"464\" data-filename=\"Screen Shot 2022-05-24 at 7.44.11 PM.png\" data-origin-width=\"402\" data-origin-height=\"464\"\/><\/span><\/figure>\n<\/p>\n<p data-ke-size=\"size16\">\uc774\ub807\uac8c \ub420 \uacbd\uc6b0 2\ub294 \ucd9c\ub825\ub418\uc9c0 \uc54a\uace0 <b>1<\/b>\ub9cc \ucd9c\ub825\ub418\ub294 \uac83\uc774\ub2e4.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h2 data-ke-size=\"size26\">1-3. defer\uc758 \uc911\ucca9 \uc0ac\uc6a9<\/h2>\n<p data-ke-size=\"size16\">defer\ub294 \uc911\ucca9\ud574\uc11c \uc0ac\uc6a9\ub3c4 \uac00\ub2a5\ud558\ub2e4. \ub2e4\ub9cc \uc774\ub7f4 \uacbd\uc6b0 \uac00\uc7a5 \ubc14\uae65\ucabd defer\ubd80\ud130 \uc2e4\ud589\ub41c\ub2e4.<\/p>\n<p><figure class=\"imageblock alignLeft\" data-ke-mobileStyle=\"widthOrigin\" data-filename=\"Screen Shot 2022-05-24 at 7.49.55 PM.png\" data-origin-width=\"492\" data-origin-height=\"472\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/btXteX\/btrC3MXsNd9\/2xBwtVxc9QVylTOkFNxXH1\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/btXteX\/btrC3MXsNd9\/2xBwtVxc9QVylTOkFNxXH1\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/btXteX\/btrC3MXsNd9\/2xBwtVxc9QVylTOkFNxXH1\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtXteX%2FbtrC3MXsNd9%2F2xBwtVxc9QVylTOkFNxXH1%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"280\" height=\"472\" data-filename=\"Screen Shot 2022-05-24 at 7.49.55 PM.png\" data-origin-width=\"492\" data-origin-height=\"472\"\/><\/span><\/figure>\n<\/p>\n<p data-ke-size=\"size16\">\uc774\ub7f0 \uc2dd\uc73c\ub85c \uc0ac\uc6a9\uc774 \uac00\ub2a5\ud558\uba70 <b>1 ,2, 3<\/b> \uc21c\uc11c\ub300\ub85c \uc2e4\ud589\uc774 \ub41c\ub2e4.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h2 data-ke-size=\"size26\">2. defer\uc758 \ud65c\uc6a9<\/h2>\n<p data-ke-size=\"size16\">\uc774\ub294 NSLock\uc5d0\uc11c \uc720\uc6a9\ud558\uac8c \uc0ac\uc6a9\ub41c\ub2e4.<\/p>\n<p data-ke-size=\"size16\">NSLock\uc5d0 \uad00\ud55c \uc774\uc57c\uae30\ub294 \ub098\uc911\uc5d0 \ub2e4\uc2dc \ub2e4\ub8e8\ub3c4\ub85d \ud558\uaca0\ub2e4.<\/p>\n<p><figure class=\"imageblock alignLeft\" data-ke-mobileStyle=\"widthOrigin\" data-filename=\"Screen Shot 2022-05-24 at 3.04.49 PM.png\" data-origin-width=\"818\" data-origin-height=\"1034\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/dt3F6u\/btrCXRfi9K1\/1nIg50wMsxMiE4ZQx9AphK\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/dt3F6u\/btrCXRfi9K1\/1nIg50wMsxMiE4ZQx9AphK\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/dt3F6u\/btrCXRfi9K1\/1nIg50wMsxMiE4ZQx9AphK\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdt3F6u%2FbtrCXRfi9K1%2F1nIg50wMsxMiE4ZQx9AphK%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"350\" height=\"1034\" data-filename=\"Screen Shot 2022-05-24 at 3.04.49 PM.png\" data-origin-width=\"818\" data-origin-height=\"1034\"\/><\/span><\/figure>\n<\/p>\n<p data-ke-size=\"size16\">\uc774\uc640 \uac19\uc774 \uba40\ud2f0 \uc2a4\ub808\ub529 \ud658\uacbd\uc5d0\uc11c Thread-Safe \ud558\uac8c \uc791\uc5c5\uc744 \ud558\uae30 \uc704\ud574 NSLock\uc744 \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n<p data-ke-size=\"size16\">\uc774 \uc0c1\ud669\uc5d0\uc11c \ud568\uc218\uac00 \uae38\uc5b4\uc9c0\uace0 \ub2e4\uc591\ud558\uac8c \ubd84\uae30\uac00 \ub098\ub260 \uc218 \uc788\uc9c0\ub9cc lock\uacfc \ub3d9\uc2dc\uc5d0 unlock\uc744 defer\ub97c \ud1b5\ud574 \ud574 \uc8fc\uac8c \ub41c\ub2e4\uba74 \uc704\uce58\uc0c1\uc73c\ub85c \ubd99\uc5b4\uc788\uae30\uc5d0 unlock\uc758 \uad00\ub9ac\uac00 \ud3b8\ud574\uc9c0\uac8c \ub41c\ub2e4.<\/p>\n<p data-ke-size=\"size16\">\ub610\ud55c unlock\uc758 \ud655\uc2e4\ud788 \ubcf4\uc7a5\ud574\uc904 \uc218 \uc788\uc5b4 \ud574\uc81c\ub97c \ud558\uc9c0 \uc54a\uc744 \uacbd\uc6b0\uc5d0 \uc0dd\uae38 \uc218 \uc788\ub294 deadlock \uc0c1\ud669\uc744 \ubc29\uc9c0\ud560 \uc218 \uc788\ub2e4.<\/p>","category":["Swift \uae30\ubcf8 \ubb38\ubc95","defer","ios","NSLock","swift","Thread-safe"],"author":"Skyline-23","guid":"https:\/\/ios-dev-skyline-23.tistory.com\/27","comments":"https:\/\/ios-dev-skyline-23.tistory.com\/27#entry27comment","pubDate":"Tue, 24 May 2022 15:02:56 +0900"},{"title":"CADisplayLink","link":"https:\/\/ios-dev-skyline-23.tistory.com\/26","description":"<p><figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-origin-width=\"1920\" data-origin-height=\"1080\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/dSy5dO\/btrCRQHd1mI\/XsI7Sqldp7Gmj7yvLukd90\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/dSy5dO\/btrCRQHd1mI\/XsI7Sqldp7Gmj7yvLukd90\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/dSy5dO\/btrCRQHd1mI\/XsI7Sqldp7Gmj7yvLukd90\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdSy5dO%2FbtrCRQHd1mI%2FXsI7Sqldp7Gmj7yvLukd90%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"1920\" height=\"1080\" data-origin-width=\"1920\" data-origin-height=\"1080\"\/><\/span><\/figure>\n<\/p>\n<h3 data-ke-size=\"size23\">0. \uac1c\ubc1c\uc790 \ubb38\uc11c \ud655\uc778<\/h3>\n<p data-ke-size=\"size16\">iOS\uc5d0\uc11c \ubdf0 \uc0dd\uc131\uacfc \uc560\ub2c8\uba54\uc774\uc158\uc744 \uacf5\ubd80\ud558\ub358 \uc911 CADisplayLink\ub77c\ub294 \uac83\uc744 \uc54c\uac8c \ub418\uc5c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">\uac04\ub2e8\ud788 \uc0b4\ud3b4\ubcf8 \uac83\uc73c\ub85c\ub294 \ud654\uba74\uc774 \uc5c5\ub370\uc774\ud2b8\ub420 \ub54c\ub9c8\ub2e4 \ud638\ucd9c\ub418\ub294 \uac1d\uccb4\ub77c\uace0 \uc801\ud600\uc788\uc5c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">\uadf8\ub798\uc11c! \uc774\ub7f0 \uac83\uc740 \ub610 \ubabb \ucc38\uace0 \uc9c0\ub098\uac00\uae30\uc5d0 \uc9c1\uc811 \uc2e4\ud5d8\uc744 \uc9c4\ud589\ud574\ubcf4\uace0 \uc2f6\uc5c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">\uc77c\ub2e8 \uc81c\uc77c \uba3c\uc800 \ud655\uc778\ud560 \uc560\ud50c \uac1c\ubc1c\uc790 \ubb38\uc11c...!<\/p>\n<p data-ke-size=\"size16\"><a href=\"https:\/\/developer.apple.com\/documentation\/quartzcore\/cadisplaylink\" target=\"_blank\" rel=\"noopener\">https:\/\/developer.apple.com\/documentation\/quartzcore\/cadisplaylink<\/a><\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h4 data-ke-size=\"size20\">1. \uac04\ub2e8 \ud504\ub808\uc784\ub960 \uce21\uc815<\/h4>\n<pre class=\"swift\" data-ke-language=\"swift\"><code>import UIKit\n\nfinal class ViewController: UIViewController {\n  \n  override func viewDidLoad() {\n    super.viewDidLoad()\n    createDisplayLink()\n    \/\/ Do any additional setup after loading the view.\n  }\n  \n  func createDisplayLink() {\n    let displayLink: CADisplayLink = CADisplayLink.init(target: self, selector: #selector(stamp(displaylink:)))\n    displayLink.add(to: .main, forMode: RunLoop.Mode.default)\n  }\n  \n  @objc func stamp(displaylink: CADisplayLink) {\n    print(\"\\\\(displaylink.timestamp) displayUpdated\")\n  }\n\n}<\/code><\/pre>\n<p data-ke-size=\"size16\">displayLink\ub97c viewDidLoad()\uc5d0\uc11c \ub9cc\ub4e4\uc5b4 \uc900 \uc774\uc720\ub294, init\uc2dc\uc5d0 \uc140\ub809\ud130\ub97c \uc0ac\uc6a9\ud558\uae30 \uc704\ud574\uc11c\uc600\ub2e4.<\/p>\n<ul style=\"list-style-type: disc;\" data-ke-list-type=\"disc\">\n<li>displayLink\ub97c add \ud558\ub294 \uacf3\uc5d0\uc11c RunLoop\ub97c \ub2e4\ub8e8\ub294\ub370, \uc774\uac83\uc5d0 \uad00\ub828\ud55c \uc544\ud2f0\ud074\uc740 \ub2e4\uc74c\uc5d0 \ub2e4\ub8e8\ub3c4\ub85d \ud558\uaca0\ub2e4.<br \/><span style=\"letter-spacing: 0px;\">\ud655\uc2e4\ud788 \ubdf0 \ucabd\uc744 \ub2e4\ub8e8\ub2e4 \ubcf4\uba74 \uc790\uc8fc \uc811\ud558\ub294 \ub2e8\uc5b4\uc778\ub370, \ud655\uc2e4\ud788 \uc815\ub9ac\uac00 \ud544\uc694\ud574 \ubcf4\uc778\ub2e4.<\/span><\/li>\n<\/ul>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<blockquote data-ke-style=\"style1\"><span style=\"font-family: 'Noto Serif KR';\"><span style=\"font-family: 'Noto Serif KR';\">\uadf8\ub7ac\ub354\ub2c8 \ucd9c\ub825 \uacb0\uacfc\uac00 \uc218\ub3c4 \uc5c6\uc774 \ub9ce\uc774 \ub098\uc654\ub2e4;;<br \/><\/span><\/span><hr contenteditable=\"false\" data-ke-type=\"horizontalRule\" data-ke-style=\"style5\" \/><span style=\"font-family: 'Noto Serif KR';\"><\/span><\/blockquote>\n<p><figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-origin-width=\"662\" data-origin-height=\"900\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/bLLZWo\/btrCQu5io78\/bcDgNcwhmrNkjOFWP8p5I0\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/bLLZWo\/btrCQu5io78\/bcDgNcwhmrNkjOFWP8p5I0\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/bLLZWo\/btrCQu5io78\/bcDgNcwhmrNkjOFWP8p5I0\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLLZWo%2FbtrCQu5io78%2FbcDgNcwhmrNkjOFWP8p5I0%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"421\" height=\"900\" data-origin-width=\"662\" data-origin-height=\"900\"\/><\/span><\/figure>\n<\/p>\n<p data-ke-size=\"size16\">\uc774 \uc2e4\ud5d8\uc5d0 \uc0ac\uc6a9\ud55c \ud14c\uc2a4\ud2b8 \uae30\uae30\uac00 \uc544\uc774\ud3f0 13 \ubbf8\ub2c8\uc774\uace0, \ud654\uba74 \uc8fc\uc0ac\uc728\uc774 60\uc774\ub2c8 \uce21\uc815 \uac04\uaca9\uc774<span>&nbsp;<\/span><b>0.01667&hellip;..<\/b><span>&nbsp;<\/span>\uc815\ub3c4\uc778 \uac83 \uac19\uc558\ub2e4.<\/p>\n<p data-ke-size=\"size16\">0.01667 * 60\uc744 \ud574\ubcf4\ub2c8 1.0002\uac00 \ub098\uc654\ub2e4. \uc218\uce58\uc0c1\uc73c\ub85c \uc644\ubcbd\ud788 \uc815\ud655\ud55c \uac83\uc740 \uc544\ub2c8\uc9c0\ub9cc 1\ucd08\uc5d0 60 \ud504\ub808\uc784\uc774 \uc7ac\uc0dd\ub418\ub294 \uac83\uc740 \ud655\uc2e4\ud558\ub2e4\ub294 \uac83\uc744 \ub290\ub084 \uc218 \uc788\uc5c8\ub2e4.<\/p>\n<hr contenteditable=\"false\" data-ke-type=\"horizontalRule\" data-ke-style=\"style1\" \/>\n<p data-ke-size=\"size16\">\uc5ec\uae30\uc11c \uc2e4\uc81c\ub85c \ud504\ub808\uc784 \ub808\uc774\ud2b8\ub97c \ud655\uc778\ud558\uae30 \uc704\ud574 targetTimestamp \ud504\ub85c\ud37c\ud2f0\uc640 timestamp \ud504\ub85c\ud37c\ud2f0\ub97c \ud65c\uc6a9\ud558\uc5ec \uc2e4\uc81c \ud504\ub808\uc784 \ub808\uc774\ud2b8\ub97c \uad6c\ud574\ubcf4\uc558\ub2e4.<\/p>\n<p data-ke-size=\"size16\">timestamp: \ub2e4\uc74c \ud504\ub808\uc784\uc758 \uc608\uce21 \uac12<\/p>\n<p data-ke-size=\"size16\">targetTimestamp: \uc77c\uc815\ud55c \ud504\ub808\uc784 \uc18d\ub3c4\uac00 \uc720\uc9c0\ub418\ub294\uc9c0 \uccb4\ud06c\ud558\uae30 \uc704\ud574 \uc0ac\uc6a9\ud558\ub294 \uac12<\/p>\n<pre class=\"swift\" data-ke-language=\"swift\"><code>\/\/ \uc2e4\uc81c \ucc0d\ud78c \ud504\ub808\uc784\uc758 \ud0c0\uc784\uc2a4\ud0ec\ud504\uc640 \ub2e4\uc74c\uc73c\ub85c \uc608\uce21\ub41c \ud0c0\uc784\uc744 \uc2dc\uac04\ucc28\ub85c \ub098\ub204\uc5b4 1\ucd08\uc5d0 \uba87\ubc88\uc815\ub3c4 \ub098\uc62c \uc218 \uc788\ub294\uc9c0\ub97c \uacc4\uc0b0\ud568\nlet actualFramesPerSecond = 1 \/ (displaylink.targetTimestamp - displaylink.timestamp)<\/code><\/pre>\n<p><figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-origin-width=\"942\" data-origin-height=\"820\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/cPg8Qu\/btrCTGRbolA\/wEnFaIDoJfRnNRbddU7Vrk\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/cPg8Qu\/btrCTGRbolA\/wEnFaIDoJfRnNRbddU7Vrk\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/cPg8Qu\/btrCTGRbolA\/wEnFaIDoJfRnNRbddU7Vrk\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPg8Qu%2FbtrCTGRbolA%2FwEnFaIDoJfRnNRbddU7Vrk%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"450\" height=\"820\" data-origin-width=\"942\" data-origin-height=\"820\"\/><\/span><\/figure>\n<\/p>\n<p data-ke-size=\"size16\">\uc774 \uac12\uc744 \ud1b5\ud574 \ud655\uc778\ud574\ubcf8 \uacb0\uacfc \uc77c\ubc18\uc801\uc778 \uc0c1\ud669\uc5d0\uc11c\ub294 \ub300\ub7b5 59 \ud504\ub808\uc784, \uc57d 60 \ud504\ub808\uc784\uc784\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc5c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h3 data-ke-size=\"size23\">2. \uc8fc\uc0ac\uc728 \uc81c\uc5b4\ud558\uae30<\/h3>\n<p data-ke-size=\"size16\">\ubc30\ud130\ub9ac\ub098 \uc131\ub2a5\uacfc \uad00\ub828\ud558\uc5ec \ubdf0\ub97c \ucd5c\uc801\ud654\ud558\uace0 \uc2f6\uc744 \ub54c\ub294 \uc9c1\uc811 \uc8fc\uc0ac\uc728\uc744 \uc81c\uc5b4\ud560 \uc218 \uc788\ub2e4.<\/p>\n<p data-ke-size=\"size16\">\ubc14\ub85c preferredFrameRateRange \ud504\ub85c\ud37c\ud2f0\ub97c \ud65c\uc6a9\ud558\ub294 \uac83\uc774\ub2e4.<\/p>\n<pre class=\"angelscript\" data-ke-language=\"swift\"><code>displayLink.preferredFrameRateRange = CAFrameRateRange.init(minimum:8, maximum:15, preferred:0)<\/code><\/pre>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">\uc6d0\ub798\ub294 preferredFramesPerSecond\uc774\ub77c\ub294 \ud504\ub85c\ud37c\ud2f0\uc600\uc73c\ub098, \uc544\uc774\ud3f0 13 \ud504\ub85c\uac00 \ub098\uc628 \uc774\ud6c4 \uac00\ubcc0 \uc8fc\uc0ac\uc728\uc744 \uc9c0\uc6d0\ud558\uba70 \ubc94\uc704\ub97c \uc81c\uacf5\ud558\uae30 \uc704\ud574 \ubc94\uc704\ub85c \ubcc0\uacbd\ub418\uc5c8\ub2e4.<\/p>\n<ul style=\"list-style-type: disc;\" data-ke-list-type=\"disc\">\n<li>\ud604\uc7ac <a href=\"https:\/\/developer.apple.com\/documentation\/quartzcore\/cadisplaylink\/1648421-preferredframespersecond\" target=\"_blank\" rel=\"noopener\">preferredFramesPerSecond<\/a> \ud504\ub85c\ud37c\ud2f0\ub294 \ubaa8\ub4e0 \uc560\ud50c \ud504\ub808\uc784\uc6cc\ud06c\uc5d0\uc11c&nbsp;<span style=\"background-color: #ffffff; color: #bf4800;\">Deprecated <span style=\"color: #333333;\">\ub418\uc5c8\ub2e4.<\/span><\/span><\/li>\n<\/ul>\n<p data-ke-size=\"size16\">\uc774\uac83\uc744 \uc0ac\uc6a9\ud558\uba74 \uc815\ud655\ud55c \uc8fc\uc0ac\uc728\uc744 \uc9c0\uc815\ud560 \uc218\ub294 \uc5c6\uc9c0\ub9cc, \uadfc\uc811\ud55c \uc8fc\uc0ac\uc728\uc744 \uc81c\uacf5\ud560 \uc218 \uc788\ub2e4.<\/p>\n<p data-ke-size=\"size16\">\ucc38\uace0 :<span>&nbsp;<\/span><a href=\"https:\/\/developer.apple.com\/documentation\/quartzcore\/optimizing_promotion_refresh_rates_for_iphone_13_pro_and_ipad_pro#\/\/apple_ref\/doc\/uid\/DTS40017657\">\uc544\uc774\ud328\ub4dc \ud504\ub85c\uc640 \uc544\uc774\ud3f0 13 pro \uc2dc\ub9ac\uc988\uc5d0\uc11c \uc8fc\uc0ac\uc728 \ucd5c\uc801\ud654 \ud558\uae30<\/a><\/p>\n<p><figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-origin-width=\"960\" data-origin-height=\"832\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/bj3KjJ\/btrCQ6pa1QX\/mfO3iadvkG7dh7xdZI24MK\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/bj3KjJ\/btrCQ6pa1QX\/mfO3iadvkG7dh7xdZI24MK\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/bj3KjJ\/btrCQ6pa1QX\/mfO3iadvkG7dh7xdZI24MK\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbj3KjJ%2FbtrCQ6pa1QX%2FmfO3iadvkG7dh7xdZI24MK%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"450\" height=\"390\" data-origin-width=\"960\" data-origin-height=\"832\"\/><\/span><\/figure>\n<\/p>\n<p data-ke-size=\"size16\">preferredFrameRateRange\ub97c \ud1b5\ud574 \uc8fc\uc0ac\uc728\uc744 \uc81c\ud55c\ud55c \uacb0\uacfc \uc57d 15 \uc815\ub3c4\uac00 \ub098\uc624\ub294 \uac83\uc744 \ud655\uc778\ud560 \uc218\uac00 \uc788\uc5c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">\uc774 \ubc94\uc704\ub97c \uc815\ud55c\ub2e4\uace0 \ud574\uc11c \ubb34\uc870\uac74 \uc774 \ubc94\uc704\uac00 \ub418\ub294 \uac8c \uc544\ub2cc, 60 \uc8fc\uc0ac\uc728\uc744 \uac00\uc9c4 \uae30\uae30\uc5d0\uc11c\ub294 15, 20, 30, 60 \ud504\ub808\uc784\uc774 \uac00\ub2a5\ud558\uace0,&nbsp;\uc870\uae08 \ub354 \ub113\uc740 \ubc94\uc704\uc640 \uc138\ubc00\ud55c \uc8fc\uc0ac\uc728 \uc870\uc808\uc774 \uac00\ub2a5\ud55c \uae30\uae30 (\ud604 13 pro \uc2dc\ub9ac\uc988)\uc5d0\uc11c\ub294 \ub2e4\uc591\ud55c \uc8fc\uc0ac\uc728\uc774 \ub098\uc62c \uc218 \uc788\uc74c\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc5c8\ub2e4.<\/p>\n<hr contenteditable=\"false\" data-ke-type=\"horizontalRule\" data-ke-style=\"style1\" \/>\n<p><figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-origin-width=\"960\" data-origin-height=\"786\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/cjBlDo\/btrCUk1WRtQ\/YxbZbYJwrx6RqS56RnKYw1\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/cjBlDo\/btrCUk1WRtQ\/YxbZbYJwrx6RqS56RnKYw1\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/cjBlDo\/btrCUk1WRtQ\/YxbZbYJwrx6RqS56RnKYw1\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjBlDo%2FbtrCUk1WRtQ%2FYxbZbYJwrx6RqS56RnKYw1%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"450\" height=\"368\" data-origin-width=\"960\" data-origin-height=\"786\"\/><\/span><\/figure>\n<\/p>\n<p data-ke-size=\"size16\">\ub610\ud55c \uc544\uc774\ud328\ub4dc \ud504\ub85c 11\uc778\uce58 3\uc138\ub300\ub85c \ud655\uc778\ud574 \ubcf8 \uacb0\uacfc, 119 \ud504\ub808\uc784\uc73c\ub85c \uc798 \ub098\uc624\ub294 \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc5c8\ub2e4!<\/p>\n<p data-ke-size=\"size16\">\uc544\uc774\ud328\ub4dc \ud504\ub85c \uc2dc\ub9ac\uc988\ub294 120 \ud504\ub808\uc784\uae4c\uc9c0 \uc62c\ub77c\uac00\uae34 \ud558\uc9c0\ub9cc, \uc544\uc774\ud3f0 13 \ud504\ub85c \uc2dc\ub9ac\uc988\uc640\ub294 \ub2e4\ub974\uac8c \uc138\ubc00\ud55c \uc870\uc808\uc740 \ubd88\uac00\ub2a5\ud558\ub2e4\uace0 \ud55c\ub2e4.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\"><span style=\"color: #000000;\" data-token-index=\"0\" data-reactroot=\"\">CADisplayLink\uac00<\/span>&nbsp;Core Animation\uc5d0 \uc0ac\uc6a9\ub41c\ub2e4\ub294 \uac83\uc740 \ub4e4\uc5c8\uc9c0\ub9cc, \uc774\uac83\uc744 \uc801\uc808\ud788 \ud65c\uc6a9\ud558\ub294 \ubc29\ubc95\uc744 \ubab0\ub790\ub294\ub370, \uc774\ub807\uac8c \uc5c5\ub370\uc774\ud2b8 \uc8fc\uae30\ub97c \ubc1b\uc744 \uc218 \uc788\ub2e4\uba74 \uc6d0\ud558\ub294 \uc560\ub2c8\uba54\uc774\uc158\uc744 \ucee4\uc2a4\ud140\ud560 \uc218 \uc788\ub2e4\ub294 \uc0dd\uac01\uc774 \ub4e4\uc5c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">\uc560\ub2c8\uba54\uc774\uc158 \ucee4\uc2a4\ud140\uc5d0 \uad00\ub828\ub41c \uac83\ub4e4\ub3c4 \ud55c\ubc88 \ub2e4\ub904\ubcfc \uacc4\ud68d\uc774\ub2e4.<\/p>","category":["iOS \ud504\ub808\uc784\uc6cc\ud06c","CAAnimation","CADisplayLink","framerate","ios","Run Loop","UIKit","uiview","\uc571 \uac1c\ubc1c"],"author":"Skyline-23","guid":"https:\/\/ios-dev-skyline-23.tistory.com\/26","comments":"https:\/\/ios-dev-skyline-23.tistory.com\/26#entry26comment","pubDate":"Mon, 23 May 2022 14:53:52 +0900"},{"title":"UI\uc791\uc5c5\uc774 Main Thread\uc5d0\uc11c \uc774\ub904\uc838\uc57c \ud558\ub294 \uc774\uc720","link":"https:\/\/ios-dev-skyline-23.tistory.com\/25","description":"<p><figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-origin-width=\"1920\" data-origin-height=\"1080\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/d65kGp\/btrCW2Ga8nr\/kmxYCBnDXzADI7j4Xik5Sk\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/d65kGp\/btrCW2Ga8nr\/kmxYCBnDXzADI7j4Xik5Sk\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/d65kGp\/btrCW2Ga8nr\/kmxYCBnDXzADI7j4Xik5Sk\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd65kGp%2FbtrCW2Ga8nr%2FkmxYCBnDXzADI7j4Xik5Sk%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"1920\" height=\"1080\" data-origin-width=\"1920\" data-origin-height=\"1080\"\/><\/span><\/figure>\n<\/p>\n<p data-ke-size=\"size16\">iOS\uc5d0\uc11c \uac1c\ubc1c\uc744 \uc9c4\ud589\ud558\ub2e4 \ubcf4\uba74, UI \uc5c5\ub370\uc774\ud2b8\uc640 \uad00\ub828\ub41c \ubaa8\ub4e0 \uc791\uc5c5\uc740 main thread\uc5d0\uc11c \uc791\uc5c5\uc744 \ud574\uc57c \ud55c\ub2e4\ub294 \uac78 \ub9ce\uc774 \ub9c8\uc8fc\uce58\uac8c \ub420 \uac83\uc774\ub2e4.<\/p>\n<p data-ke-size=\"size16\">\ud56d\uc0c1 \uc774\uc5d0 \uad00\ud55c \uc815\ud655\ud55c \uc774\uc720\ub97c \ubaa8\ub974\uace0 \ub118\uacbc\uc9c0\ub9cc \uc774\ubc88 \uae30\ud68c\uc5d0 \uc774\uac83\uc744 \ud55c\ubc88 \uc790\uc138\ud788 \uc815\ub9ac\ud574\ubcf4\ub824 \ud55c\ub2e4.<\/p>\n<p data-ke-size=\"size16\">\uba3c\uc800 \uac00\uc7a5 \ub9ce\uc774 \ub098\ud0c0\ub0a0 \uac1c\ub150\uc778 Thread Safe\uc5d0 \ub300\ud574\uc11c \uc54c\uc544\ubcf4\uaca0\ub2e4.<\/p>\n<blockquote data-ke-style=\"style2\">\n<h4 data-ke-size=\"size20\"><b>Thread Safe\ub780?<\/b><\/h4>\n<\/blockquote>\n<p data-ke-size=\"size16\">\uba40\ud2f0 \uc2a4\ub808\ub4dc \ud504\ub85c\uadf8\ub798\ubc0d\uc5d0\uc11c \uc77c\ubc18\uc801\uc73c\ub85c \uc5b4\ub5a4 \ud568\uc218\ub098 \ubcc0\uc218, \ud639\uc740 \uac1d\uccb4\uac00 \uc5ec\ub7ec \uc2a4\ub808\ub4dc\ub85c\ubd80\ud130 &ldquo;\ub3d9\uc2dc\uc5d0&rdquo; \uc811\uadfc\uc774 \uc774\ub8e8\uc5b4\uc838\ub3c4 \ud504\ub85c\uadf8\ub7a8\uc758 \uc2e4\ud589\uc5d0 \ubb38\uc81c\uac00 \uc5c6\uc74c\uc744 \uc758\ubbf8\ud55c\ub2e4.<\/p>\n<p data-ke-size=\"size16\">UIKit\uc740 \uae30\ubcf8\uc801\uc73c\ub85c Thread Safe\ud558\uc9c0 \uc54a\ub2e4. UIKit\uacfc \uac19\uc740 \ub9e4\uc6b0 \ud070 \ud504\ub808\uc784\uc6cc\ud06c\uc5d0\uc11c\uc758 \ubaa8\ub4e0 \uc18d\uc131\ub4e4\uc744 Thread Safe \ud558\uac8c \uc124\uacc4\ud558\ub294 \uac83\uc740 \uc5c4\uccad \ube44\ud604\uc2e4\uc801\uc774\uae30\uc5d0 Serial Queue\uc5d0\uc11c \ucc98\ub9ac\ud568\uc73c\ub85c\uc368 Thread Safe \uc54a\uc74c\uc73c\ub85c \uc0dd\uae30\ub294 \ubb38\uc81c\ub4e4\uc744 \ud574\uacb0\ud560 \uc218 \uc788\ub2e4.<\/p>\n<h4 data-ke-size=\"size20\">1. UI\uc640 \uad00\ub828\ub41c \ubaa8\ub4e0 \uc774\ubca4\ud2b8 \ucc98\ub9ac\ub97c \uba54\uc778 \uc2a4\ub808\ub4dc\uc5d0\uc11c \ucc98\ub9ac\ud558\uae30 \ub54c\ubb38\uc774\ub2e4.<\/h4>\n<p data-ke-size=\"size16\">iOS \uc571\uc740 \uc5ec\ub7ec Thread\ub97c \uac00\uc9c0\uace0 \uc788\ub2e4. \uc571\uc744 \uc2e4\ud589\ud558\uac8c \ub41c\ub2e4\uba74 Cocoa Touch\uc5d0\uc11c UIApplication \uc778\uc2a4\ud134\uc2a4\uac00 \uba54\uc778 \uc2a4\ub808\ub4dc\uc5d0\uc11c \uc0dd\uc131\ub41c\ub2e4.<\/p>\n<p data-ke-size=\"size16\">UIApplication\uc740 \uc571\uc744 \uc2dc\uc791\ud560 \ub54c \ucc98\uc74c\uc73c\ub85c \uc778\uc2a4\ud134\uc2a4 \ud654\uac00 \ub418\ub294 \ubd80\ubd84\uc774\uba70 \uc571\uc758 \uc804\uccb4 Run loop\ub97c \ud3ec\ud568\ud55c main event loop\ub97c \uc124\uc815\ud558\uace0 event \ucc98\ub9ac\ub97c \uc2dc\uc791\ud55c\ub2e4.<\/p>\n<p data-ke-size=\"size16\">\uc571\uc758 UI Event(\uc0ac\uc6a9\uc790\uc758 \ud130\uce58)\ub294 \uc77c\ubc18\uc801\uc73c\ub85c UIApplication &rarr; UIWindow &rarr; UIViewController &rarr; UIView(UIViewController&rsquo;s View) &rarr; subviews (UIButtons \ub4f1\uacfc \uac19\uc740 \ucef4\ud3ec\ub10c\ud2b8)\uc640 \uac19\uc774 chain\uc73c\ub85c \uc5f0\uacb0\ub418\ub294\ub370, \uc774 responder chain\uc744 \ub530\ub77c UIResponder\ub85c \uc804\ub2ec\ub41c\ub2e4.<\/p>\n<p data-ke-size=\"size16\">\uc774\ub7ec\ud55c event chain\uc774 main thread\uc5d0\uc11c \ub3d9\uc791\ud558\ubbc0\ub85c responder chain\uc5d0 \ud3ec\ud568\ub41c \ubaa8\ub4e0 UI \uad00\ub828 \ub3d9\uc791\ub4e4\uc740 \uba54\uc778 \uc2a4\ub808\ub4dc\uc5d0\uc11c \uc218\ud589\ub418\uc5b4\uc57c \ud55c\ub2e4.<\/p>\n<h4 data-ke-size=\"size20\">2. \uc131\ub2a5\uc0c1\uc758 \ubb38\uc81c\uac00 \uc0dd\uae38 \uac00\ub2a5\uc131\uc774 \ub192\ub2e4.<\/h4>\n<p data-ke-size=\"size16\">iOS\uac00 \uc0ac\uc6a9\uc790\uc758 \ud654\uba74\uc5d0 \ud45c\uc2dc\ud558\ub294 \ub80c\ub354\ub9c1 \ud504\ub85c\uc138\uc2a4\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<p data-ke-size=\"size16\">\ucc38\uace0 : <a href=\"https:\/\/ios-dev-skyline-23.tistory.com\/entry\/Core-Animation-Pipeline\">Core Animation Pipeline<\/a><\/p>\n<figure id=\"og_1653441937474\" contenteditable=\"false\" data-ke-type=\"opengraph\" data-ke-align=\"alignCenter\" data-og-type=\"article\" data-og-title=\"Core Animation Pipeline\" data-og-description=\"Commit Transaction Layout \ub2e8\uacc4: \ub808\uc774\uc5b4 \uc815\ub82c \ubc0f \uc704\uce58\uc640 \uc0c9\uc0c1\uc744 \uc815\uc758 (layoutSubviews\ub97c \ud638\ucd9c) Display: draw\uba54\uc11c\ub4dc\ub4e4\uc774 \uc811\uadfc\ud558\ub294 \ub2e8\uacc4. \uac1c\ubc1c\uc790\ub4e4\uc740 \uc9c1\uc811 \ud638\ucd9c\uc744 \ubabb\ud558\uba70 setNeedsDisplay\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc811\uadfc\ud574\uc57c\ud55c..\" data-og-host=\"ios-dev-skyline-23.tistory.com\" data-og-source-url=\"https:\/\/ios-dev-skyline-23.tistory.com\/entry\/Core-Animation-Pipeline\" data-og-url=\"https:\/\/ios-dev-skyline-23.tistory.com\/entry\/Core-Animation-Pipeline\" data-og-image=\"https:\/\/scrap.kakaocdn.net\/dn\/bfAIBa\/hyOxquuNMi\/TxEeFjpABJyZJlrxlNkBf1\/img.png?width=800&amp;height=450&amp;face=0_0_800_450,https:\/\/scrap.kakaocdn.net\/dn\/8nWNJ\/hyOxph2951\/ODlkEG8KgHZZFzyAY2i0l0\/img.png?width=800&amp;height=450&amp;face=0_0_800_450,https:\/\/scrap.kakaocdn.net\/dn\/ORQmn\/hyOxtdGXN0\/yVGcbK8ki8sgjoAQtzJ8y0\/img.png?width=1920&amp;height=1080&amp;face=0_0_1920_1080\"><a href=\"https:\/\/ios-dev-skyline-23.tistory.com\/entry\/Core-Animation-Pipeline\" target=\"_blank\" rel=\"noopener\" data-source-url=\"https:\/\/ios-dev-skyline-23.tistory.com\/entry\/Core-Animation-Pipeline\">\n<div class=\"og-image\" style=\"background-image: url('https:\/\/scrap.kakaocdn.net\/dn\/bfAIBa\/hyOxquuNMi\/TxEeFjpABJyZJlrxlNkBf1\/img.png?width=800&amp;height=450&amp;face=0_0_800_450,https:\/\/scrap.kakaocdn.net\/dn\/8nWNJ\/hyOxph2951\/ODlkEG8KgHZZFzyAY2i0l0\/img.png?width=800&amp;height=450&amp;face=0_0_800_450,https:\/\/scrap.kakaocdn.net\/dn\/ORQmn\/hyOxtdGXN0\/yVGcbK8ki8sgjoAQtzJ8y0\/img.png?width=1920&amp;height=1080&amp;face=0_0_1920_1080');\">&nbsp;<\/div>\n<div class=\"og-text\">\n<p class=\"og-title\" data-ke-size=\"size16\">Core Animation Pipeline<\/p>\n<p class=\"og-desc\" data-ke-size=\"size16\">Commit Transaction Layout \ub2e8\uacc4: \ub808\uc774\uc5b4 \uc815\ub82c \ubc0f \uc704\uce58\uc640 \uc0c9\uc0c1\uc744 \uc815\uc758 (layoutSubviews\ub97c \ud638\ucd9c) Display: draw\uba54\uc11c\ub4dc\ub4e4\uc774 \uc811\uadfc\ud558\ub294 \ub2e8\uacc4. \uac1c\ubc1c\uc790\ub4e4\uc740 \uc9c1\uc811 \ud638\ucd9c\uc744 \ubabb\ud558\uba70 setNeedsDisplay\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc811\uadfc\ud574\uc57c\ud55c..<\/p>\n<p class=\"og-host\" data-ke-size=\"size16\">ios-dev-skyline-23.tistory.com<\/p>\n<\/div>\n<\/a><\/figure>\n<p data-ke-size=\"size16\">\uc774\ucc98\ub7fc \uc5ec\ub7ec Thread\uc5d0\uc11c \ub3d9\uc2dc\uc5d0 UI \uc5c5\ub370\uc774\ud2b8 \uc694\uccad\uc744 \ubcf4\ub0b4\uac8c \ub41c\ub2e4\uba74 GPU\uc5d0 \ubcd1\ubaa9\ud604\uc0c1\uc774 \uc0dd\uae38 \uac83\uc774\uace0, \ub9ce\uc740 \uc2dc\uc2a4\ud15c \ub9ac\uc18c\uc2a4\ub97c \uc0ac\uc6a9\ud558\ub294 \ub80c\ub354\ub9c1 \uc791\uc5c5\uc744 GPU\uac00 \ucc98\ub9ac\ud560 \uc218 \uc5c6\uc5b4 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud560 \uac00\ub2a5\uc131\uc774 \ub192\ub2e4.<\/p>\n<h4 data-ke-size=\"size20\">3. Main Thread\uc758 View \uc5c5\ub370\uc774\ud2b8 \uc8fc\uae30\uac00 View Drawing Cycle\uc744 \ud1b5\ud574 \uc5c5\ub370\uc774\ud2b8\ub418\uae30 \ub54c\ubb38\uc774\ub2e4.<\/h4>\n<p data-ke-size=\"size16\">\ubdf0\uc758 \ubcc0\uacbd\uc0ac\ud56d\uc740 UIApplication\uc5d0\uc11c \uc0dd\uc131\ub41c Run Loop\uc758 \ub05d\uc5d0\uc11c \ub2e4\uc2dc \ub80c\ub354\ub9c1 \ub41c\ub2e4.<\/p>\n<p data-ke-size=\"size16\">\uc774\ub7ec\uba74 \ud55c \ubc88\uc5d0&nbsp;\ubaa8\ub4e0 \ubdf0\uc758 \ubcc0\uacbd\uc0ac\ud56d\uc774 \ucc98\ub9ac\ub420 \uc218 \uc788\ub294\ub370, \uc774\ub97c<span>&nbsp;<\/span><b>View Drawing Cycle<\/b>\uc774\ub77c\uace0 \ud55c\ub2e4.<\/p>\n<p data-ke-size=\"size16\">\ub9cc\uc57d Background Thread\uc5d0\uc11c \uac01\uac01\uc758 Run-Loop\ub300\ub85c \uc5c5\ub370\uc774\ud2b8\uac00 \ub420 \uacbd\uc6b0 \uac01\uc790\uc758 \uac31\uc2e0\uc8fc\uae30\ub97c \ub530\ub85c \uac00\uc9c0\uba70 View\ub4e4\uc774 \uc81c\uba4b\ub300\ub85c \ub3d9\uc791\ud560 \ud655\ub960\uc774 \ub192\ub2e4.<\/p>","category":["iOS \ud504\ub808\uc784\uc6cc\ud06c","event chain","ios","main thread","Run Loop","thread safe","UIApplication","UIEvent","UIKit","uiview"],"author":"Skyline-23","guid":"https:\/\/ios-dev-skyline-23.tistory.com\/25","comments":"https:\/\/ios-dev-skyline-23.tistory.com\/25#entry25comment","pubDate":"Fri, 20 May 2022 13:33:17 +0900"},{"title":"CGRect, CGSize, CGPoint\uc5d0 \ub300\ud558\uc5ec","link":"https:\/\/ios-dev-skyline-23.tistory.com\/24","description":"<p><figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-origin-width=\"1920\" data-origin-height=\"1080\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/d4wlTB\/btrCVOBvpQf\/6x55YSLt7gSMP1qREFzeEK\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/d4wlTB\/btrCVOBvpQf\/6x55YSLt7gSMP1qREFzeEK\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/d4wlTB\/btrCVOBvpQf\/6x55YSLt7gSMP1qREFzeEK\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd4wlTB%2FbtrCVOBvpQf%2F6x55YSLt7gSMP1qREFzeEK%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"1920\" height=\"1080\" data-origin-width=\"1920\" data-origin-height=\"1080\"\/><\/span><\/figure>\n<\/p>\n<p data-ke-size=\"size16\">\ucd5c\uadfc UI\uc758 \uc791\ub3d9\ubc29\uc2dd\uc5d0 \uad00\uc2ec\uc774 \ub9ce\uc544\uc838 \ub2e4\uc2dc \uae30\ucd08\ubd80\ud130 \uacf5\ubd80\ud558\uac8c \ub418\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">PinLayout\uacfc FlexLayout \uac19\uc740 \uc678\ubd80 \uc11c\ub4dc\ud30c\ud2f0 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \ud65c\uc6a9\ud55c UI\uc5d0 \uad00\uc2ec\uc744 \uac00\uc9c0\uace0 \ucc3e\uc544\ubcf4\uace0 \uc788\uc5c8\ub294\ub370, \ud655\uc2e4\ud788 \uae30\uc874\uc5d0 \uc0ac\uc6a9\ud558\ub358 \uc624\ud1a0 \ub808\uc774\uc544\uc6c3\uacfc\ub294 \ub2e4\ub978 \uac1c\ub150\uc774\uc5c8\uc5b4\uc694... \uc774\uac83\ub3c4 \uae30\ud68c\uac00 \ub41c\ub2e4\uba74 \ub098\uc911\uc5d0 \ud55c\ubc88 \uc815\ub9ac\ub97c \ud574\ubcf4\ub3c4\ub85d \ud560\uac8c\uc694!<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">\ub85c\ub529 \uc18d\ub3c4\uac00 \uc5b4\ub9c8 \ubb34\uc2dc\ud558\uac8c \ube60\ub978 \ub140\uc11d\ub4e4\uc785\ub2c8\ub2e4 \ud6c4\ub4e4\ud6c4\ub4e4...<\/p>\n<p data-ke-size=\"size16\"><a href=\"https:\/\/github.com\/layoutBox\/PinLayout\">https:\/\/github.com\/layoutBox\/PinLayout<\/a><\/p>\n<figure id=\"og_1651116541234\" contenteditable=\"false\" data-ke-type=\"opengraph\" data-ke-align=\"alignCenter\" data-og-type=\"object\" data-og-title=\"GitHub - layoutBox\/PinLayout: Fast Swift Views layouting without auto layout. No magic, pure code, full control and blazing fast\" data-og-description=\"Fast Swift Views layouting without auto layout. No magic, pure code, full control and blazing fast. Concise syntax, intuitive, readable &amp; chainable. [iOS\/macOS\/tvOS\/CALayer] - GitHub - layoutBo...\" data-og-host=\"github.com\" data-og-source-url=\"https:\/\/github.com\/layoutBox\/PinLayout\" data-og-url=\"https:\/\/github.com\/layoutBox\/PinLayout\" data-og-image=\"https:\/\/scrap.kakaocdn.net\/dn\/bDytwp\/hyOcD2siiv\/213o9BYdwBloIubzw5ylp0\/img.png?width=1200&amp;height=600&amp;face=0_0_1200_600\"><a href=\"https:\/\/github.com\/layoutBox\/PinLayout\" target=\"_blank\" rel=\"noopener\" data-source-url=\"https:\/\/github.com\/layoutBox\/PinLayout\">\n<div class=\"og-image\" style=\"background-image: url('https:\/\/scrap.kakaocdn.net\/dn\/bDytwp\/hyOcD2siiv\/213o9BYdwBloIubzw5ylp0\/img.png?width=1200&amp;height=600&amp;face=0_0_1200_600');\">&nbsp;<\/div>\n<div class=\"og-text\">\n<p class=\"og-title\" data-ke-size=\"size16\">GitHub - layoutBox\/PinLayout: Fast Swift Views layouting without auto layout. No magic, pure code, full control and blazing fast<\/p>\n<p class=\"og-desc\" data-ke-size=\"size16\">Fast Swift Views layouting without auto layout. No magic, pure code, full control and blazing fast. Concise syntax, intuitive, readable &amp; chainable. [iOS\/macOS\/tvOS\/CALayer] - GitHub - layoutBo...<\/p>\n<p class=\"og-host\" data-ke-size=\"size16\">github.com<\/p>\n<\/div>\n<\/a><\/figure>\n<p data-ke-size=\"size16\"><a href=\"https:\/\/github.com\/layoutBox\/FlexLayout\">https:\/\/github.com\/layoutBox\/FlexLayout<\/a><\/p>\n<figure id=\"og_1651116539803\" contenteditable=\"false\" data-ke-type=\"opengraph\" data-ke-align=\"alignCenter\" data-og-type=\"object\" data-og-title=\"GitHub - layoutBox\/FlexLayout: FlexLayout adds a nice Swift interface to the highly optimized facebook\/yoga flexbox implementati\" data-og-description=\"FlexLayout adds a nice Swift interface to the highly optimized facebook\/yoga flexbox implementation. Concise, intuitive &amp; chainable syntax. - GitHub - layoutBox\/FlexLayout: FlexLayout adds a ni...\" data-og-host=\"github.com\" data-og-source-url=\"https:\/\/github.com\/layoutBox\/FlexLayout\" data-og-url=\"https:\/\/github.com\/layoutBox\/FlexLayout\" data-og-image=\"https:\/\/scrap.kakaocdn.net\/dn\/yU9yl\/hyOcw90KD8\/kcma9z3weskD9DtiSLCfb0\/img.png?width=1200&amp;height=600&amp;face=0_0_1200_600\"><a href=\"https:\/\/github.com\/layoutBox\/FlexLayout\" target=\"_blank\" rel=\"noopener\" data-source-url=\"https:\/\/github.com\/layoutBox\/FlexLayout\">\n<div class=\"og-image\" style=\"background-image: url('https:\/\/scrap.kakaocdn.net\/dn\/yU9yl\/hyOcw90KD8\/kcma9z3weskD9DtiSLCfb0\/img.png?width=1200&amp;height=600&amp;face=0_0_1200_600');\">&nbsp;<\/div>\n<div class=\"og-text\">\n<p class=\"og-title\" data-ke-size=\"size16\">GitHub - layoutBox\/FlexLayout: FlexLayout adds a nice Swift interface to the highly optimized facebook\/yoga flexbox implementati<\/p>\n<p class=\"og-desc\" data-ke-size=\"size16\">FlexLayout adds a nice Swift interface to the highly optimized facebook\/yoga flexbox implementation. Concise, intuitive &amp; chainable syntax. - GitHub - layoutBox\/FlexLayout: FlexLayout adds a ni...<\/p>\n<p class=\"og-host\" data-ke-size=\"size16\">github.com<\/p>\n<\/div>\n<\/a><\/figure>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">\uadf8\ub807\uac8c \uae30\ucd08\ubd80\ud130 \ub2e4\uc2dc \uacf5\ubd80\ud558\ub358 \uc911 CGRect\uc640 CGSize\ub97c \ub2e4\ub8f0 \uc77c\uc774 \ub9ce\uc544\uc838\uc11c \uc815\ub9ac\ub97c \ud574\ubcf4\ub824\uace0 \ud569\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h4 data-ke-size=\"size20\"><b>\uc77c\ub2e8 \uba3c\uc800 \uae30\ubcf8\uc774 \ub418\ub294 CGPoint\uc5d0 \ub300\ud574\uc11c \uc124\uba85\uc744 \ub4dc\ub9b4\uac8c\uc694!<\/b><\/h4>\n<p data-ke-size=\"size16\">\uc5ed\uc2dc \uadfc\ubcf8\uc740 \uc560\ud50c \uac1c\ubc1c\uc790 \ubb38\uc11c\uac00 \uc544\ub2d0\uae4c\uc694?<\/p>\n<p><figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-origin-width=\"1548\" data-origin-height=\"808\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/booCiq\/btrAFaAyqp2\/dvcEXa1782lQQZRawXNaL0\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/booCiq\/btrAFaAyqp2\/dvcEXa1782lQQZRawXNaL0\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/booCiq\/btrAFaAyqp2\/dvcEXa1782lQQZRawXNaL0\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbooCiq%2FbtrAFaAyqp2%2FdvcEXa1782lQQZRawXNaL0%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"1548\" height=\"808\" data-origin-width=\"1548\" data-origin-height=\"808\"\/><\/span><\/figure>\n<\/p>\n<p data-ke-size=\"size16\">CGPoint\ub294 2\ucc28\uc6d0 \uc88c\ud45c \uc2dc\uc2a4\ud15c\uc758 \uc810\uc744 \ud3ec\ud568\ud558\ub294 \uad6c\uc870\uccb4\ub77c\uace0 \ub098\uc640\uc788\uc5b4\uc694<\/p>\n<p data-ke-size=\"size16\">\uc815\ub9d0 \uac04\ub2e8\ud558\uac8c \uc0dd\uac01\ud574\ubcf4\uc790\uba74 \ud568\uc218\uc758 x\uc88c\ud45c, y\uc88c\ud45c\ub85c \uc0dd\uac01\ud558\uc2dc\uba74 \ub420 \uac83 \uac19\uc544\uc694!<\/p>\n<p><figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-origin-width=\"1104\" data-origin-height=\"1152\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/WirYb\/btrAD8XueAz\/Dw1LLVKfj1iLQyO4eifGkK\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/WirYb\/btrAD8XueAz\/Dw1LLVKfj1iLQyO4eifGkK\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/WirYb\/btrAD8XueAz\/Dw1LLVKfj1iLQyO4eifGkK\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWirYb%2FbtrAD8XueAz%2FDw1LLVKfj1iLQyO4eifGkK%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"1104\" height=\"1152\" data-origin-width=\"1104\" data-origin-height=\"1152\"\/><\/span><\/figure>\n<\/p>\n<p data-ke-size=\"size16\">\ud504\ub808\uc784 \uc6cc\ud06c\ub97c \ub530\ub77c \ub4e4\uc5b4\uac00 \ubcf4\uc558\ub354\ub2c8 CGFloat\uac12\uc744 x\uc640 y\uac12\uc73c\ub85c \ubc1b\ub294 \ub2e8\uc21c\ud55c \uad6c\uc870\uccb4\ub85c \uc774\ub8e8\uc5b4\uc838 \uc788\ub294 \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">\ud3c9\uc18c\uc5d0 \ub9ce\uc774 \ubcf4\ub358 zero\ub3c4 \ubcf4\uc774\ub124\uc694. <s><span style=\"color: #9d9d9d;\">\uad1c\ud788 \ubc18\uac00\uc6b4 \ub290\ub08c \u314e\u314e<\/span><\/s><\/p>\n<p data-ke-size=\"size16\">UIView\ub97c \uc0dd\uc131\ud560 \ub54c. zero\ub97c \ub9ce\uc774 \uc0ac\uc6a9\ud588\ub294\ub370, (0, 0)\uc744 \ub098\ud0c0\ub0b4\uace0 \uc788\ub124\uc694.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h4 data-ke-size=\"size20\"><b>\uadf8\ub2e4\uc74c\uc73c\ub85c \ubcfc \uac83\uc740 CGSize\uc785\ub2c8\ub2e4!<\/b><\/h4>\n<p><figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-origin-width=\"1574\" data-origin-height=\"718\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/bzoPNm\/btrAIP9M51e\/5opDi7ItTBIAqSKDYmx1P1\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/bzoPNm\/btrAIP9M51e\/5opDi7ItTBIAqSKDYmx1P1\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/bzoPNm\/btrAIP9M51e\/5opDi7ItTBIAqSKDYmx1P1\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzoPNm%2FbtrAIP9M51e%2F5opDi7ItTBIAqSKDYmx1P1%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"1574\" height=\"718\" data-origin-width=\"1574\" data-origin-height=\"718\"\/><\/span><\/figure>\n<\/p>\n<p data-ke-size=\"size16\">\ub113\uc774\uc640 \ub192\uc774\ub97c \ud3ec\ud568\ud558\ub294 \uad6c\uc870\uccb4\ub77c\uace0 \uc124\uba85\uc774 \ub418\uc5b4\uc788\ub124\uc694<\/p>\n<p><figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-origin-width=\"1186\" data-origin-height=\"984\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/BGAyr\/btrAG5kEpeH\/7qNpaGwkB7AuRQwmUIfssk\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/BGAyr\/btrAG5kEpeH\/7qNpaGwkB7AuRQwmUIfssk\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/BGAyr\/btrAG5kEpeH\/7qNpaGwkB7AuRQwmUIfssk\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBGAyr%2FbtrAG5kEpeH%2F7qNpaGwkB7AuRQwmUIfssk%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"1186\" height=\"984\" data-origin-width=\"1186\" data-origin-height=\"984\"\/><\/span><\/figure>\n<\/p>\n<p data-ke-size=\"size16\">\ud504\ub808\uc784\uc6cc\ud06c\uc5d0\uc11c\ub3c4 \ud655\uc778\ud560 \uc218 \uc788\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<h4 data-ke-size=\"size20\">\uadf8\ub798\uc11c \uc774 2\uac1c\ub97c \uc65c \uc54c\uc544\ubd24\ub0d0!<\/h4>\n<h4 data-ke-size=\"size20\">\ubc14\ub85c<span>&nbsp;<\/span><b>CGRect<\/b>\uc758 init\uc5d0 \ud544\uc694\ud558\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4.<\/h4>\n<h4 data-ke-size=\"size20\">\uc544\ub9c8\ub3c4 \uc624\ub298\uc758 \ud575\uc2ec\uc77c \uac83 \uac19\uc740\ub370, \ud55c\ubc88 \ud655\uc778\ud574\ubcfc\uac8c\uc694.<\/h4>\n<p><figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-origin-width=\"1554\" data-origin-height=\"716\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/dcSeKY\/btrAD8QKA9S\/mTNl0OBQ6BXAJ4G8Ih4qy1\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/dcSeKY\/btrAD8QKA9S\/mTNl0OBQ6BXAJ4G8Ih4qy1\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/dcSeKY\/btrAD8QKA9S\/mTNl0OBQ6BXAJ4G8Ih4qy1\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcSeKY%2FbtrAD8QKA9S%2FmTNl0OBQ6BXAJ4G8Ih4qy1%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"1554\" height=\"716\" data-origin-width=\"1554\" data-origin-height=\"716\"\/><\/span><\/figure>\n<\/p>\n<p data-ke-size=\"size16\">\uc0ac\uac01\ud615\uc758 \uc704\uce58\uc640 \ud06c\uae30\ub97c \ud3ec\ud568\ud558\ub294 \uad6c\uc870\uccb4\ub77c\uace0 \ub098\uc640\uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p><figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-origin-width=\"2000\" data-origin-height=\"1140\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/bHXFxA\/btrAG5EWi60\/QhSx2fPaIZi9MdFj4msPaK\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/bHXFxA\/btrAG5EWi60\/QhSx2fPaIZi9MdFj4msPaK\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/bHXFxA\/btrAG5EWi60\/QhSx2fPaIZi9MdFj4msPaK\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHXFxA%2FbtrAG5EWi60%2FQhSx2fPaIZi9MdFj4msPaK%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"2000\" height=\"1140\" data-origin-width=\"2000\" data-origin-height=\"1140\"\/><\/span><\/figure>\n<\/p>\n<p data-ke-size=\"size16\">origin\uc774\ub77c\ub294 \uac83\uacfc size\ub97c \uc778\uc790\ub85c \ubc1b\uc2b5\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">size\ub294 \ud06c\uae30\ub97c \ub73b\ud558\ub294 \uac83\uc740 \uc54c\uaca0\ub294\ub370, origin\uc740 \uc65c \ubc1b\uc744\uae4c\uc694?<\/p>\n<p data-ke-size=\"size16\">\uadf8\uac83\uc740 CGRect\uac00 \uc704\uce58\ub97c \ud3ec\ud568\ud558\ub294 \uad6c\uc870\uccb4\uc774\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">\ud06c\uae30\ub294 \uc54c\uc558\ub294\ub370, \uc5b4\ub514\uc5d0 \uc5bc\ub9c8\ub9cc\ud07c \uadf8\ub824\uc57c \ud560\uc9c0\ub3c4 \uac19\uc774 \uc54c\ub824\uc918\uc57c\uaca0\uc8e0.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">UIView\ub97c \uadf8\ub9b4 \ub54c \uac00\ub054\uc529 init\uc5d0 frame\uc73c\ub85c CGRect\ub97c \ubc1b\ub294 \uacbd\uc6b0\ub97c \uac00\ub054\uc529 \ubcf4\uc168\uc744 \uac70\uc608\uc694.<\/p>\n<p data-ke-size=\"size16\">\uac70\uae30\uc11c .zero\ub97c \ub9ce\uc774 \uc37c\ub294\ub370, \uc774\uac83\uc740 origin\uacfc size\ub97c \uc804\ubd80 (0, 0) (0, 0)\uc73c\ub85c \ub9cc\ub4e4\uc5b4\uc8fc\uaca0\ub2e8 \ub73b\uc785\ub2c8\ub2e4!<\/p>\n<p data-ke-size=\"size16\">\uadf8\ub7f0\ub370 .zero\ub97c \uc4f0\uba74 \ud654\uba74\uc5d0 \ubcf4\uc774\uc9c0 \uc54a\uc744 \ud150\ub370, \uc5b4\ub5bb\uac8c \ud654\uba74\uc5d0 \ub098\ud0c0\ub098\ub294\uc9c0\uc5d0 \ub300\ud574\uc11c\ub3c4 \uc758\ubb38\uc744 \uac00\uc9c0\uac8c \ub418\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p data-ke-size=\"size16\">\uc544\ub9c8 \ud3c9\uc0c1\uc2dc \uc4f0\ub294 \uc624\ud1a0 \ub808\uc774\uc544\uc6c3\uc774 CGRect\uc5d0 \uc9c1\uc811 \uad00\uc5ec\ub97c \ud558\ub294 \uac83 \uac19\uc740\ub370, \uc774 \ubd80\ubd84\uc5d0 \ub300\ud574\uc11c\ub294 \uc870\uae08 \ub354 \uacf5\ubd80 \ud6c4 \ucc3e\uc544\uc624\ub3c4\ub85d \ud560\uac8c\uc694!<\/p>","category":["iOS \ud504\ub808\uc784\uc6cc\ud06c","Autolayout","CGPoint","CGRect","CGSize","ios","layout","swift","uiview","\uc571 \uac1c\ubc1c"],"author":"Skyline-23","guid":"https:\/\/ios-dev-skyline-23.tistory.com\/24","comments":"https:\/\/ios-dev-skyline-23.tistory.com\/24#entry24comment","pubDate":"Thu, 28 Apr 2022 12:34:45 +0900"},{"title":"iOS \uc571 v1.0.2 \uc5c5\ub370\uc774\ud2b8 - 2021.12.10","link":"https:\/\/ios-dev-skyline-23.tistory.com\/23","description":"<p><figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-origin-width=\"1920\" data-origin-height=\"1080\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/NR7fK\/btrCW2THv78\/DuOQycWTxI9hcHPVSvbQRK\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/NR7fK\/btrCW2THv78\/DuOQycWTxI9hcHPVSvbQRK\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/NR7fK\/btrCW2THv78\/DuOQycWTxI9hcHPVSvbQRK\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNR7fK%2FbtrCW2THv78%2FDuOQycWTxI9hcHPVSvbQRK%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"1920\" height=\"1080\" data-origin-width=\"1920\" data-origin-height=\"1080\"\/><\/span><\/figure>\n<\/p>\n<h2 data-ke-size=\"size26\">UPDATE) \uc77c\uae30 \uc571 \uc601\uc5b4 \ubc84\uc804 \ucd94\uac00<\/h2>\n<hr contenteditable=\"false\" data-ke-type=\"horizontalRule\" data-ke-style=\"style5\" \/>\n<p data-ke-size=\"size16\">\uae30\uc874 \uc77c\uae30 \uc571\uc740 \ud55c\uad6d\uc5b4\ub85c \uc81c\uc791\ub418\uc5c8\ub2e4. \uadf8\ub7ec\ub098 \uc870\uae08 \ub354 \ub2e4\uc591\ud55c \uad6d\uac00\uc758 \uc0ac\ub78c\ub4e4\uc774 \uc6b0\ub9ac \uc77c\uae30 \uc571\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc5c8\uc73c\uba74 \uc88b\uaca0\ub2e4\uace0 \uc0dd\uac01\ud588\uace0, \uc804 \uc138\uacc4\uc5d0 \ubcf4\ud3b8\uc801\uc73c\ub85c \uc0ac\uc6a9\ub418\ub294 \uc5b8\uc5b4\uc778 \uc601\uc5b4 \ubc84\uc804\uc744 \uc5c5\ub370\uc774\ud2b8\ud558\uae30\ub85c \uacb0\uc815\ud588\ub2e4.<\/p>\n<p data-ke-size=\"size16\">\uc77c\ubcf8\uc5b4, \uc911\uad6d\uc5b4\ub3c4 \uc11c\ube44\uc2a4\ud558\uace0 \uc2f6\uc5c8\uc9c0\ub9cc \uc5c5\ub370\uc774\ud2b8 \ub0b4\uc5ed\uc744 \uc801\uae30\uac00 \uc5b4\ub824\uc6e0\ub2e4. \uc77c\ub2e8 \uc601\uc5b4\ub97c \uba3c\uc800 \uc11c\ube44\uc2a4\ud558\uace0, \uc55e\uc73c\ub85c \uc5b8\uc5b4\ub4e4\uc744 \ucd94\uac00\ud560 \uacc4\ud68d\uc774\ub2e4.<\/p>\n<p data-ke-size=\"size16\">\uae30\uc874 \uc5b8\uc5b4\ub4e4\uc744 \uc601\uc5b4\ub85c \ubc14\uafb8\uace0, NSLocalizedString\uc744 \uc774\uc6a9\ud574 \ud55c\uad6d\uc5b4 \ubc88\uc5ed\uc744 \uc9c4\ud589\ud558\uc600\ub2e4.<\/p>\n<p data-ke-size=\"size16\">\uc571 \uc6a9\ub7c9\uc774 \ud06c\uc9c0 \uc54a\uc558\uae30 \ub54c\ubb38\uc5d0 \ub2e8\uc21c \ubc88\uc5ed\ud558\ub294 \uc791\uc5c5\uc740 \ud06c\uac8c \uc624\ub798\uac78\ub9ac\uc9c0 \uc54a\uc558\ub2e4.<\/p>","category":["\uc624\ub298\ud558\ub8e8 \uac1c\ubc1c \uc77c\uc9c0","ios","\uc571 \uac1c\ubc1c","\uc624\ub298\ud558\ub8e8"],"author":"Skyline-23","guid":"https:\/\/ios-dev-skyline-23.tistory.com\/23","comments":"https:\/\/ios-dev-skyline-23.tistory.com\/23#entry23comment","pubDate":"Tue, 26 Apr 2022 15:51:58 +0900"},{"title":"iOS \uc571 v1.0.1 \uc5c5\ub370\uc774\ud2b8 - 2021.12.06. ~ 2021.12.07","link":"https:\/\/ios-dev-skyline-23.tistory.com\/22","description":"<article id=\"4cf3f73b-ab23-4cd2-b141-2b354d01f274\" class=\"page sans Notion_P\">\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<\/article>\n<p><figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-origin-width=\"1920\" data-origin-height=\"1080\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/vgHxj\/btrCUl0Z2ox\/BqA1w8asm2gQeXHxlzRN01\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/vgHxj\/btrCUl0Z2ox\/BqA1w8asm2gQeXHxlzRN01\/img.png\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/vgHxj\/btrCUl0Z2ox\/BqA1w8asm2gQeXHxlzRN01\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvgHxj%2FbtrCUl0Z2ox%2FBqA1w8asm2gQeXHxlzRN01%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"1920\" height=\"1080\" data-origin-width=\"1920\" data-origin-height=\"1080\"\/><\/span><\/figure>\n<\/p>\n<h2 data-ke-size=\"size26\"><span style=\"color: #000000;\">UPDATE) \ube48 \ud0dc\uadf8\uac00 \ub4e4\uc5b4\uac00\ub294 \ubb38\uc81c \uc218\uc815<\/span><\/h2>\n<p style=\"position: absolute;\" data-ke-size=\"size16\">&nbsp;<\/p>\n<hr contenteditable=\"false\" data-ke-type=\"horizontalRule\" data-ke-style=\"style5\" \/>\n<p data-ke-size=\"size16\">\uae30\uc874\uc5d0 \uc544\uc608 \ud0dc\uadf8 \ud14d\uc2a4\ud2b8 \ud544\ub4dc\ub97c \uc801\uc9c0 \uc54a\uc558\ub2e4\uba74 \uc77c\uae30\uac00 \uc791\uc131\ub418\uc9c0 \uc54a\uc558\uc9c0\ub9cc, \ud14d\uc2a4\ud2b8 \ud544\ub4dc\uc5d0 #\uc774\ub77c\ub294 \uae00\uc790\ub9cc \uc788\uc744 \ub54c\ub294 \uc7a1\uc544\ub0b4\uc9c0 \ubabb\ud558\ub294 \ubc84\uadf8\uac00 \uc788\uc5c8\ub2e4.<\/p>\n<p data-ke-size=\"size16\">#\uacfc \uacf5\ubc31\uc740 \uae00\uc790\ub85c \ucde8\uae09\ud558\uc9c0 \uc54a\uace0 \uac80\uc0ac\ud574 \uae38\uc774\uac00 0\uc774 \ub098\uc624\uba74 \ube48 \ud0dc\uadf8 \ub9ac\uc2a4\ud2b8\ub85c \uc778\uc2dd\ud558\uace0 \uc77c\uae30\uac00 \uc791\uc131\ub418\uc9c0 \uc54a\ub3c4\ub85d \uc218\uc815\ud558\uc600\ub2e4.<\/p>\n<p data-ke-size=\"size16\">&nbsp;<\/p>\n<p><figure class=\"imageblock alignCenter\" data-ke-mobileStyle=\"widthOrigin\" data-origin-width=\"1125\" data-origin-height=\"2436\"><span data-url=\"https:\/\/blog.kakaocdn.net\/dn\/mKdWZ\/btrAxGSUMI4\/DvZsIfP9Fb8aPMIeQdooXK\/img.png\" data-phocus=\"https:\/\/blog.kakaocdn.net\/dn\/mKdWZ\/btrAxGSUMI4\/DvZsIfP9Fb8aPMIeQdooXK\/img.png\" data-alt=\"\uc704 \uc0ac\uc9c4\uacfc \uac19\uc774 #\uc774\ub77c\ub294 \ub2e8\uc77c \ud0dc\uadf8\ub85c \ub098\uc628\ub2e4.\"><img src=\"https:\/\/blog.kakaocdn.net\/dn\/mKdWZ\/btrAxGSUMI4\/DvZsIfP9Fb8aPMIeQdooXK\/img.png\" srcset=\"https:\/\/img1.daumcdn.net\/thumb\/R1280x0\/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmKdWZ%2FbtrAxGSUMI4%2FDvZsIfP9Fb8aPMIeQdooXK%2Fimg.png\" onerror=\"this.onerror=null; this.src='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png'; this.srcset='\/\/t1.daumcdn.net\/tistory_admin\/static\/images\/no-image-v1.png';\" loading=\"lazy\" width=\"244\" height=\"529\" data-origin-width=\"1125\" data-origin-height=\"2436\"\/><\/span><figcaption>\uc704 \uc0ac\uc9c4\uacfc \uac19\uc774 #\uc774\ub77c\ub294 \ub2e8\uc77c \ud0dc\uadf8\ub85c \ub098\uc628\ub2e4.<\/figcaption>\n<\/figure>\n<\/p>\n<p data-ke-size=\"size16\">\ub610\ud55c \uc0ac\uc6a9\uc790\uac00 \uc4f0\uba74\uc11c # \uc774\ub77c\ub294 \ube48 \uae00\uc790\ub97c \uba54\uc778\ud654\uba74\uc5d0\uc11c \ubcf4\ub294 \ubd88\ud3b8\ud568\uc744 \uacaa\uc9c0 \uc54a\ub3c4\ub85d \uc774\ub97c \uc218\uc815\ud588\ub2e4.<br \/>\uae30\uc874\uc5d0 \ud0dc\uadf8\ub97c \uc791\uc131\ud560 \uacbd\uc6b0 \uc911\uac04\uc5d0 \"# \" \uc774\ub7ec\ud55c \ud615\ud0dc\uc758 \ud615\uc2dd\uc73c\ub85c \uc874\uc7ac\ud55c \ud0dc\uadf8\ub294 \uba54\uc778\ud654\uba74\uc5d0\uc11c \uc544\ubb34 \ub0b4\uc6a9\ub3c4 \uc5c6\ub294 \ud0dc\uadf8\uac00 \ub098\uc624\ub294 \ubc84\uadf8\uac00 \uc788\uc5c8\ub2e4. \uc774\ubbf8 \uc791\uc131\ub41c \uc77c\uae30\uc5d0\uc11c\ub294 \uc5b4\uca54 \uc218 \uc5c6\uc9c0\ub9cc, \uc0c8\ub85c \uc77c\uae30\ub97c \uc4f0\uac70\ub098, \uc77c\uae30 \uc218\uc815\uc744 \ud560 \uacbd\uc6b0\uc5d0 \uae30\uc874\uc5d0 # \ud0dc\uadf8\ub9cc \uc788\ub358 \uac83\ub4e4\uc740 \uc0ac\ub77c\uc9c8 \uac83\uc774\ub2e4.<br \/>\uae30\uc874\uc5d0 \ud0dc\uadf8\ub97c \uc791\uc131\ud560 \uacbd\uc6b0 \uc911\uac04\uc5d0 \"# \" \uc774\ub7ec\ud55c \ud615\ud0dc\uc758 \ud615\uc2dd\uc73c\ub85c \uc874\uc7ac\ud55c \ud0dc\uadf8\ub294 \uba54\uc778\ud654\uba74\uc5d0\uc11c \uc544\ubb34 \ub0b4\uc6a9\ub3c4 \uc5c6\ub294 \ud0dc\uadf8\uac00 \ub098\uc624\ub294 \ubc84\uadf8\uac00 \uc788\uc5c8\ub2e4. \uc774\ubbf8 \uc791\uc131\ub41c \uc77c\uae30\uc5d0\uc11c\ub294 \uc5b4\uca54 \uc218 \uc5c6\uc9c0\ub9cc, \uc0c8\ub85c \uc77c\uae30\ub97c \uc4f0\uac70\ub098, \uc77c\uae30 \uc218\uc815\uc744 \ud560 \uacbd\uc6b0\uc5d0 \uae30\uc874\uc5d0 # \ud0dc\uadf8\ub9cc \uc788\ub358\uac83\ub4e4\uc740 \uc0ac\ub77c\uc9c8 \uac83\uc774\ub2e4.<\/p>\n<h2 data-ke-size=\"size26\"><br \/><span style=\"color: #000000;\">UPDATE) \uc571 \uc0ad\uc81c\uc2dc \ub85c\uadf8\uc544\uc6c3\uc774 \ub418\uc9c0 \uc54a\ub294 \ubb38\uc81c \uc218\uc815<\/span><\/h2>\n<hr data-ke-type=\"horizontalRule\" data-ke-style=\"style5\" \/>\n<p data-ke-size=\"size16\">\ud604\uc7ac \uc81c\uc791\ud55c \uc624\ub298\ud558\ub8e8 \uc571\uc740 \ud0a4\uccb4\uc778\uc744 \uc0ac\uc6a9\ud558\uace0 \uc788\ub2e4. \uc774 \ud0a4\uccb4\uc778\uc740 \uc720\uc800\ub4e4\uc758 \uc815\ubcf4\ub97c \uc548\uc804\ud558\uac8c \ubcf4\uad00\ud560 \uc218 \uc788\ub294 \uc7a5\uc810\uc774 \uc788\uc9c0\ub9cc, \uc720\uc800\ub4e4\uc774 \uc571\uc744 \uc0ad\uc81c\ud574\ub3c4 UserDefault\uc640 \uac19\uc774 \uc815\ubcf4\uac00 \uc0ad\uc81c\ub418\uc9c0 \uc54a\uace0 \ub0a8\uc544\uc788\uc5c8\ub2e4. \uadf8\ub7ec\ub098 \uc571\uc744 \uc0ad\uc81c\ud558\uae30 \ubc14\ub85c \uc9c1\uc804 \uc2e4\ud589\ub418\uac8c \ud560 \uc218\ub294 \uc5c6\uc5c8\uace0, \ucd5c\ucd08 \ub85c\uadf8\uc778 \uc2dc \uad6c\ubd84\ud560 \uc218 \uc788\ub3c4\ub85d \ud574\uc8fc\ub294 UserDefault \uac12\uc744 \ud558\ub098 \ub9cc\ub4e4\uc5b4\uc11c \uc571\uc744 \ucd5c\ucd08 \uc2e4\ud589 \uc2dc \ub85c\uadf8\uc544\uc6c3\uc744 \ud558\uace0 \ucd08\uae30\ud654\ub97c \ud574\uc8fc\uc5c8\ub2e4.<br \/>\uadf8\ub7ec\ub098 \uc774 \uc5c5\ub370\uc774\ud2b8\ub97c \uc9c4\ud589\ud558\uba74 \uae30\uc874 UserDefault \uac12\uc774 \uc5c6\uc5c8\uae30 \ub54c\ubb38\uc5d0 \ucc98\uc74c \uc571\uc744 \ud0a8 \uac83\uc73c\ub85c \uc778\uc2dd\ud558\uace0 \ub85c\uadf8\uc544\uc6c3\uc774 \ub418\ub294 \ubb38\uc81c\uac00 \uc788\uc5c8\ub2e4. \uadf8\ub7ec\ub098 \uc774 \uc5c5\ub370\uc774\ud2b8\ub97c \ub3c4\uc785\ud558\uc9c0 \uc54a\uc73c\uba74 \uc720\uc800\ub4e4\uc774 \ub354 \ub9ce\uc544\uc84c\uc744 \uacbd\uc6b0 \ub354 \uc2ec\uac01\ud55c \ubb38\uc81c\ub85c \uc774\uc5b4\uc9c8 \uc218 \uc788\ub2e4\uace0 \uc0dd\uac01\ud588\uace0 \uc5c5\ub370\uc774\ud2b8\ub97c \uc9c4\ud589\ud558\uac8c \ub418\uc5c8\ub2e4.<\/p>","category":["\uc624\ub298\ud558\ub8e8 \uac1c\ubc1c \uc77c\uc9c0","ios","\uc571 \uac1c\ubc1c","\uc624\ub298\ud558\ub8e8"],"author":"Skyline-23","guid":"https:\/\/ios-dev-skyline-23.tistory.com\/22","comments":"https:\/\/ios-dev-skyline-23.tistory.com\/22#entry22comment","pubDate":"Tue, 26 Apr 2022 15:40:17 +0900"}]}}