티스토리 뷰
AssociatedObject에 대해 간단히 정리해 보았습니다!!
AssociatedObject는 런타임시 기존 클래스에 SubClassing 없이 사용자 정의 속성을 연결(추가) 할 수 있습니다.
아래는 AssociatedObject 관련 함수입니다.
// 객체에 속성 값을 연결
public func objc_setAssociatedObject(_ object: Any,
_ key: UnsafeRawPointer,
_ value: Any?,
_ policy: objc_AssociationPolicy)
// 연결된 속성 값을 반환
public func objc_getAssociatedObject(_ object: Any,
_ key: UnsafeRawPointer) -> Any?
// 객체에 연결된 모든 속성 값을 제거
// 제거하면 안되는 속성까지 제거될 수 있기 때문에,
// 일반적으로 objc_setAssociatedObject을 nil로 설정하여 필요한 속성만 제거합니다.
public func objc_removeAssociatedObjects(_ object: Any)
- parameters
object - 속성을 연결하려는 객체
key - 속성에 대한 키 값
value - 객체와 연결하려는 속성 값
policy - 속성 연결 시 참조 유형을 정의하는 값
- objc_AssociationPolicy 속성 종류
// 연관된 오브젝트에 대한 약한 참조를 지정합니다.
OBJC_ASSOCIATION_ASSIGN
// 연관된 오브젝트가 복사되고 ATOMIC으로 설정합니다.
OBJC_ASSOCIATION_COPY
// 연관된 오브젝트가 복사되고 NONATOMIC으로 설정합니다.
OBJC_ASSOCIATION_COPY_NONATOMIC
// 연관된 오브젝트에 대한 강력한 참조를 지정하고 ATOMIC으로 설정합니다.
OBJC_ASSOCIATION_RETAIN
// 연관된 오브젝트에 대한 강력한 참조를 지정하고 NONATOMIC으로 설정합니다.
OBJC_ASSOCIATION_RETAIN_NONATOMIC
런타임에서 클래스에 고유 속성을 선언할 경우 사용되는 속성이라고 합니다.... 잘 이해는 되지 않습니다...
How to use
사용법을 간단히 설명하면, 미리 선언한 키에 원하는 값을 저장하여 사용하도록 합니다.
아래는 키에 String 값을 저장하여 출력하는 코드입니다.
extension UIButton {
private struct AssociatedKeys {
static var tempString = "abc" // 1
}
var tempString: String? {
get {
// 2
return (objc_getAssociatedObject(self, &AssociatedKeys.tempString) as? String)
}
set(newValue) {
// 3
objc_setAssociatedObject(self,
&AssociatedKeys.tempString,
newValue,
.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
}
let button = UIButton()
button.tempString = "ABC"
print(button.tempString) // "ABC"
button.tempString = nil // 4
print(button.tempString) // nil
- 값을 저장하기 위해 선언된 키입니다.
- objc_getAssociatedObject 메소드를 사용하여 키에 저장된 값을 불러 옵니다.
- objc_setAssociatedObject 메소드를 사용해 키에 값을 저장합니다.
- 해당 키의 값을 nil로 설정하여 해당 키에 연결된 값만 제거합니다.
objc_removeAssociatedObjects 메소드를 사용하면 객체와 연결된 모든 값들이 제거되기 때문에 조심해야 합니다.
어떤 방식으로 키에 값을 연결하여 사용하는지 간단히 정리해 보았습니다.
다음 포스팅에는 클로저를 저장하여 사용하는 내용에 대해 정리해보겠습니다~ 👋👋👋
AssociatedObject를 이용하여 클로저를 저장하는 내용을 정리한 포스팅입니당~ 👇👇👇
- Reference
'Swift' 카테고리의 다른 글
[swift] xib를 이용한 alertView 만들기 (0) | 2020.07.19 |
---|---|
[swift] UIButton에 클로저를 추가해 보았습니다. (0) | 2020.07.14 |
[Swift] HTTP Live Streaming을 위한 재생 목록 (m3u8) (0) | 2020.06.09 |
[Swift] Documentation Comments (0) | 2020.05.29 |
[swift] AVFoundation를 이용한 Video Record 만들어보기 (2) | 2020.03.25 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Coordinator
- IOS
- UIBarButtonItem
- Cleancode
- NIB
- database
- BaseViewController
- AssociatedObject
- RECORDING
- customAlertView
- permission error
- AVKit
- http live streaming
- UIControl
- pagingView
- HLS
- Swift
- testing
- TDD
- xib
- CollectionView
- Closure
- AVFoundation
- m3u8
- Video
- ssh
- Realm
- UIButton
- carousel
- Design Pattern
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
글 보관함