티스토리 뷰
클래스 수정없이 새로운 값을 추가하여야 하는 경우가 있습니다.
그 경우의 예로는 extension을 사용할 경우에 값을 주입시켜서 사용하여야 하는 경우가 이런 경우일것 같은데요.
이럴때 사용할수 있는것이 Associated References가 될것 같습니다.
일단 강점이라고 생각하면 클래스의 수정없이 사용할 수 있다는것인데요.
그렇다고 아주 코드를 사용하지 않고서 만들수는 없습니다.
왜냐면 키를 만들어서 넣어주어야 하거든요
사용방법은 다음과 같습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import UIKit extension UIButton { private struct AssociatedKeys { static var test = "Test" } var test: String? { get { return (objc_getAssociatedObject(self, &AssociatedKeys.test) as? String) } set { guard let newValue = newValue as String? else { return } objc_setAssociatedObject(self, &AssociatedKeys.test, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) } } } let button = UIButton() button.test = "AAA" print("\(button.test ?? "nil")") | cs |
그냥 보시면 느낌이 올것입니다.
AssociatedKeys라는 struct를 만들어서 test키를 만들었습니다. 이것을 키로 사용을 하였고요.
아래쪽에 보면 get, set을 사용하여서 값을 가져오도록 하였습니다.
사용 방법은 objc_getAssociatedObject를 사용하여 값을 가져오고, objc_setAssociatedObject를 사용하여 값을 저장합니다.
결과적으로 아래에 버튼을 만들고 print한 코드는 정상적으로 동작합니다.
이상태에서 nil을 넣어주게 되면 객체에 연결된 값이 연결이 끊어지게 됩니다.
추가적으로 완전히 다 제거를 하고 싶을때는
1 | objc_removeAssociatedObjects(self) | cs |
이것과 같이 사용을 하면 되는데요. 이러한 경우에는 소스로 사용되는 객체의 모든 Associated References가 해제되게 되므로 주의가 필요합니다.
옵션
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | /**< Specifies a weak reference to the associated object. */ case OBJC_ASSOCIATION_ASSIGN /**< Specifies a strong reference to the associated object. * The association is not made atomically. */ case OBJC_ASSOCIATION_RETAIN_NONATOMIC /**< Specifies that the associated object is copied. * The association is not made atomically. */ case OBJC_ASSOCIATION_COPY_NONATOMIC /**< Specifies a strong reference to the associated object. * The association is made atomically. */ case OBJC_ASSOCIATION_RETAIN /**< Specifies that the associated object is copied. * The association is made atomically. */ case OBJC_ASSOCIATION_COPY | cs |
오브젝티브를 하였던 분들은 웬만하면 느낌이 올것 같네요.
assign하던가 retain하던가하는 옵션을 주는겁니다. 뒤는 원자성의 문자부분. 웬만하면 다들 nopnatomic을 사용하였죠.
성능에 이슈가 있으니까요.
'Mobile > iOS' 카테고리의 다른 글
RxSwift. Hot, Cold Observe (0) | 2018.12.21 |
---|---|
print, debugPrint (0) | 2018.12.10 |
Swift. Codable Decoding (2) (0) | 2018.10.07 |
iOS. swift defer (0) | 2018.09.01 |
iOS. Custom View 만들기 (0) | 2018.08.14 |
- Total
- Today
- Yesterday
- Gradle
- MySQL
- Windows
- Spring
- nodejs
- SWIFT
- docker
- Linux
- Java
- enum
- golang
- ubuntu
- Codable
- Python
- Xcode
- php
- war
- github
- android
- windows10
- rxswift
- go
- CentOS
- git
- Kotlin
- ios
- tomcat
- centos8
- cocoapods
- intellij
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |