티스토리 뷰

Swift

[swift] AssociatedObject

진태우 2020. 7. 11. 21:59

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
  1. 값을 저장하기 위해 선언된 키입니다.
  2. objc_getAssociatedObject 메소드를 사용하여 키에 저장된 값을 불러 옵니다.
  3. objc_setAssociatedObject 메소드를 사용해 키에 값을 저장합니다.
  4. 해당 키의 값을 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

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함