[swift] AssociatedObject
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를 이용하여 클로저를 저장하는 내용을 정리한 포스팅입니당~ 👇👇👇
[swift] UIButton에 클로저를 추가해 보았습니다.
동적으로 버튼을 생성해야 할 경우, selector를 미리 선언해줘야 하기 때문에 이벤트를 추가하는데 어려움이 있을 수 있습니다. 이를 위해 AssociatedObject 를 이용하여 UIButton에 closure를 추가하는 방��
jintaewoo.tistory.com
- Reference
Associated Objects
Associated Objects is a feature of the Objective-C 2.0 runtime, which allows objects to associate arbitrary values for keys at runtime. It’s dark juju, to be handled with as much caution as any other function from objc/runtime.h
nshipster.com