최근 이 친구로 몇개 물어보았는데 좋은거 같다 얘랑 한 부분들이랑 잡다한 공부 내용을 기록 해보려고한다.
아래의 글들은 chatGPT를 활용하였다는 점 알아주십쇼
클로저를 만들고 이를 실행하려면 클로저를 호출해야한다. 하지만 한 번만 호출해도 문제가 없는 경우가 존재한다.(실제로 내 프로젝트에는 그런 경우가 존재함)
이런 경우에는 아래와 같이 호출을 하였는데 이 두가지의 차이가 무엇일까 갑자기 궁금해서 한 번 물어보았다.
print(foo)
_ = foo
클로저를 호출하면 클로저의 로컬 변수를 저장하기 위해 새로운 스택 프레임이 생성되고, 클로저가 반환되면 스택 프레임은 폐기된다고 함.
위 설명을 듣고, 두 가지 경우의 차이는 print
는 출력을 한다는 부분이다. 나머진 동일하다. 그래서 출력하는 부분이 거대하다면 차이는 나겠지만 그렇지 않다면 크게 신경 쓰지 않아도 될 정도인듯하다.
chatGPT 선생님은 신이야 ~
이건 개인적으로 궁금했던 부분이다. lazy
를 사용하면 다 좋은데 단점 중 하나가 다중 스레드 환경에서 초기화를 한 번한다는 보장이 없다는 점을 본적이 있다. 여러 스레드에서 동시에 접근하면 초기화가 여러 번 일어난다는 의미이다.
하지만 내가 주로lazy
를 사용하는 코드는 UI 그리는 경우이다.
private lazy var title: UILabel = {
let title = UILabel()
....
return title
}()
UI를 그리는 것은 메인 스레드에서 이루어진다고 배웠다. 그렇다면 UI를 그리는 경우에 lazy
속성을 사용한다면 이는 메인스레드에서만 이루어지므로 초기화가 여러 번 발생하는 문제는 해결이 되었다.
chatGPT 선생님도 그렇게 말하고있다. 하지만 그럼에도 다중 스레드 환경에서 lazy
속성을 사용하려면 스레드 안전성을 지켜서 만드는것은 좋은 관습이라고도 해줌
locking
이나 dispatch barriers
를 사용한다면 스레드 안정성을 얻을 수 있을거라고 함.
이 부분은 나중에 또 공부를 해봐야겠그만 ~
feat chatGPT
At the heart of the touch mechanism is the UIView class, which represents a rectangular area on the screen that can respond to touch input.
터치 메커니즘의 중심에는 터치 입력에 응답할 수 있는 화면의 직사각형 영역을 나타내는 UIView 클래스가 있습니다.
When a user touches the screen, the iOS system generates a series of touch events that are sent to the appropriate view for processing
사용자가 화면을 터치하면 iOS 시스템은 처리를 위해 적절한 뷰로 전송되는 터치 이벤트를 생성한다.
The touch events include information such as the touch location, touch phase, and touch force, which can be used by the view to determine how to respond to the touch.
터치 이벤트에는 터치 위치, 터치 단계 및 터치 힘과 같은 정보가 포함되며, 이는 뷰에서 터치에 응답하는 방법을 결정하는 데 사용할 수 있다.
To handle touch events, a view must implement a set of touch-related methods, such as touchesBegan, touchesMoved, and touchesEnded
터치 이벤트를 처리하려면 뷰가 touchesBegan, touchesMoved, touchesEnded
같은 터치 관련 메서드를 구현해야 한다.
Run loop
관점에서도 설명을 부탁해보았다.
터치 메커니즘은 런 루프의 개념과 밀접하게 연결되어 있다고 한다. 런 루프는 이벤트 흐름과 앱의 사용자 인터페이스를 통한 입력을 관리하는 시스템의 기본 부분임다.
런 루프는 입력 이벤트가 발생하기를 기다리며 앱의 백그라운드에서 연속적으로 실행되는 루프이다. 사용자의 터치 입력과 같은 이벤트가 발생하면 실행 루프가 이벤트를 처리하고 그에 따라 앱의 사용자 인터페이스를 업데이트합니다.
런 루프는 앱에서 발생할 수 있는 다양한 종류의 이벤트 및 입력을 나타내는 일련의 입력 소스에서 작동함. 이는 터치, 키보드, 타이머, 네트워크 이벤트 등이 포함될 수 있슴니다.
iOS의 터치 매커니즘은 런 루프의 입력 소스로 구현된다. 즉, 사용자가 화면을 터치하면 터치 이벤트가 입력 큐에 추가되고 런 루프에서 처리됩니다.
다음 런 루프는 뷰 계층 구조 및 터치 위치에 따라 처리를 위해 터치 이벤트를 적절한 뷰로 전달합니다.
뷰는 상위 뷰가 터치에 응답할 수 있도록 뷰 계층 위로 터치 이벤트를 전달할 수 있슴니다.
chatGPT가 설명한 부분에서 더 궁금한 부분을 물어보았다. 어떻게 터치 이벤트를 적절한 뷰로 전달하는가? 를 물어봄
어떤 뷰가 터치 이벤트를 처리해야 하는지 결정하기 위해 런 루프는 뷰 계층 구조의 맨 위에서 시작하여 터치 위치를 포함하는 뷰를 찾을 때까지 아래로 내려갑니다.
이 뷰는 hit-tested view
로 알려져 있으며, 터치 이벤트를 처리할 뷰이다. 이 'hit-test'를 거치고 뷰가 결정이 되면 런 루프는 터치 단계에 다라 뷰의 적절한 메서드에 터치 이벤트를 전달합니다.
hit-test
도 설명 부탁헤 chatGPT !
iOS에서 hit-testing
은 화면의 특정 지점에서 발생하는 터치 이벤트를 수신해야 하는 뷰 계층 구조의 뷰를 결정하는 프로세스 입니다.
터치 이벤트가 발생하면 시스템은 먼저 위치 및 단계와 같은 터치에 대한 정보를 포함하는 UITouch
객체를 생성합니다. 그런 다음 시스템은 터치 이벤트를 앱의 뷰 계층 구조 최상위에 있는 UIWindow
로 전달함니다.
그런 다음 UIWindow
는 hit-testing
을 사용하여 뷰를 결정합니다.
이 hit-testing
프로세스는 뷰 계층 구조 맨위에서 시작하여 터치 위치를 포함하는 뷰를 찾을 때까지 하위 뷰를 통해 아래로 작동함다.
터치 이벤트를 수신해야 하는 뷰를 결정하기 위해서 위 알고리즘은 먼저 터치 위치가 창 자체의 경계 내부에 있는지 여부를 확인합니다. 터치 위치가 범위 밖이라면 이 프로세스는 완료되고 hit-testing
이 수행되지 않습니다.
터치 위치가 범위 내에 있는 경우 hit-testing
은 창의 각 하위 뷰를 검사하여 터치 위치가 해당 범위 내에 있는지 확인합니다. 터치 위치가 하위 뷰의 범위 내에 있다면 하위 뷰는 hit
으로 간주하며, 이 알고리즘은 재귀적으로 하위 뷰를 확인합니다.
여러 하위 뷰에 터치 위치가 포함된 경우, 이 알고리즘은 뷰 계층 구조의 맨 위에 있는 뷰에 우선 순위를 부여합니다. 이렇게 하면 다른 뷰 위에 겹쳐진 뷰가 아래에 있는 뷰 보다 먼저 터치 이벤트를 수신합니다.
설명이 꽤 괜찮은듯하다.. 무서울지경 공부할 때 자주 애용해야게쓰~