13.12.21 릴리 TIL : @IBOutlet strong/weak, name space, COW

Lily·2021년 12월 13일
0

Today I Learned

목록 보기
28/30

🤓 학습 내용


1. 접근성 지원

접근성 지원은 생각보다 똑똑하다.

label의 값이 10이라고 적혀져있을 때 "십"이 아닌 "열"로 읽을 줄도 안다.

@IBOutlet var strawberryLabel: UILabel!
let strawberryValue = strawberryLabel.text
let strawberryLabel.accessibilityLabel = "\(strawberryValue.text)개"  // 열개

더 공부할 내용!

정확하게 어떤 설정을 했을 때 "열"이라고 읽혀지는 지는 잘 모르겠는데
더 찾아봐야겠다.

그리고 위 코드와 같이 작성하면 앱 실행중에 딸기의 개수를 줄여주면 그 줄여준 수량이 반영이 되어서 읽히지 않는데,
읽히는 label도 런타임에 유동적으로 변하게 하려면 어떻게 코드를 작성해야할지 고민해봐야겠다.

2. Copy On Write

수정(쓰기)가 일어날 때 복사한다.
그 전에는 같은 메모리 주소를 공유함으로써 더 메모리를 아껴쓸 수 있다.
스위프트의 Collection Type에서 사용된다.

같은 메모리 주소를 공유한다는 말은
두개의 다른 변수가 같은 메모리 주소에 살고 있다는 말이다.

다른 변수가 같은 메모리주소를 공유한다는 것이 이해가 잘 안되는데...
어떻게 그게 가능하지?

참고
https://nsios.tistory.com/56 [NamS의 iOS일기]


3. @IBOutlet이 weak일 때랑 strong일 때 차이점

ARC와 강한 순환 참조에 대해 좀 더 공부해볼 수 있었다.
강한 순환 참조에 대해 정리한 글🤓

@IBOutlet에 strong 을 써야 하는 경우

복잡한 view heirachy를 가진 경우 weak로 모든 connection을 주면
어떤 view가 어느 이유인지 모르게 메모리에서 해제된다면 view의 subview도 해제될 것이다.

따라서 strong으로 연결해줘서 그런 상황을 방지할 수 있다.

즉, 복잡한 view heirachy를 가지는 경우

@IBOutlet에 weak 을 써야 하는 경우

메모리 부족으로 시스템에 의해 ViewController의 didReceiveMemoryWarning가 호출될 경우
weak로 연결된 뷰들은 해제될 수 있지만, strong으로 연결된 뷰는 해제가 되지 않는다.
보통 mainView에 nil을 할당해줘서 mainView가 해제되면서 나머지 subview도 연쇄적으로 해제가 되는데, strong일 경우 reference count가 1이라서 해제되지않고 남아있는다.

따라서 default로 weak을 사용하자!

참고
Interface Builder IBOutlet연결에 Strong과 Weak 어떤것을 써야할까?

4. name space

개체를 구분할 수 있는 범위를 나타내는 말로 일반적으로 하나의 이름 공간에서는 하나의 이름이 단 하나의 개체만을 가리키게 된다. - 위키피디아 -

음 그러니깐, 앱 전반에서 쓰이는 상수인데,
상수의 이름이 겹칠거 같을 때 이름 공간을 만들어줘서
각 상수를 고유하게 식별할 수 있도록 돕는 장치라고 이해를 했다.

만약 다 리터럴로 쓰면 관리가 힘들고 안정성이 떯어지니깐...

Swift에서 name space 구현 방법

스위프트는 namespace에 대한 솔루션을 제공하지는 않지만,
구조체와 열거형으로 namespace를 구현할 수는 있다!

그런데 이를 구조체의 static property로 구현을 하면,
struct는 이니셜라이즈 될 수 있으니, 같이 일하는 개발자 입장에서 응? 뭐지 혼란 스러울 수도 있다는 단점이 있다. (private init으로 구현해주면 되긴 함)

반면 열거형의 static property로 구현을 하면,
이니셜라이즈할 일 도 없으니, 사용이 깔끔! 하다는 장점이 있다.

enum Identifier {
    static let entryCell = "entryCell"
    static let entryDetailView = "entryDetailView"
}

참고
[Swift] Namespace 네임스페이스 란? (Struct, Enum 활용)

profile
i🍎S 개발을 합니다

0개의 댓글