[Swift] AssociatedObject

민경준·2022년 4월 8일
1

AssociatedObject 에 대해서 간단히 정리해봤습니다.

AssociatedObject는 SubClassing 없이 Extension에서 속성이나 메소드를 추가하거나 제거할 수 있도록 도와주며 객체에 객체를 저장 방식으로 런타임시 결정되는 강력한 Objective-C 함수 입니다.

Declarations

/// 1. 지정된 키에 대해 지정된 개체와 연결된 값을 반환합니다.
func objc_getAssociatedObject(_ object: Any, 
                            _ key: UnsafeRawPointer) -> Any?
                            
/// 2. 지정된 키 및 연결 정책을 사용하여 지정된 개체에 대한 연결 값을 설정합니다.
func objc_setAssociatedObject(_ object: Any, 
                            _ key: UnsafeRawPointer, 
                            _ value: Any?, 
                            _ policy: objc_AssociationPolicy)
                            
/// 3. 지정된 개체에 대한 모든 연결을 제거합니다.
/// 제거 하면 안되는 속성까지 제거 될 수 있기 때문에
/// 보통 objc_setAssociatedObject에 nil 값을 설정하여 제거 합니다.
func objc_removeAssociatedObjects(_ object: Any)

Parameters

  1. object: 연결에 대한 원본 객체입니다.
  2. key: 연결 키입니다.
  3. value: 객체에 연결할 속성값 입니다. 기존 연결을 지우려면 nil을 전달합니다.
  4. policy: 연결에 대한 정책입니다. 가능한 값은 objc_AssociationPolicy를 참조하십시오.

objc_AssociationPolicy

/// 연결된 객체에 대한 약한 참조를 지정합니다.
case OBJC_ASSOCIATION_ASSIGN
/// 연결된 객체를 복사하고 연결을 atomic으로 만들도록 지정합니다.
case OBJC_ASSOCIATION_COPY
/// 연결된 개체를 복사하고 연결을 nonatomic으로 만들도록 지정합니다.
case OBJC_ASSOCIATION_COPY_NONATOMIC
/// 연결된 개체에 대한 강력한 참조를 지정하고 연결을 atomic으로 만들도록 지정합니다.
case OBJC_ASSOCIATION_RETAIN
/// 연결된 개체에 대한 강력한 참조를 지정하고 연결을 nonatomic으로 만들도록 지정합니다.
case OBJC_ASSOCIATION_RETAIN_NONATOMIC

atomic: 다른 프로세스나 쓰레드에 의해 interrupt 되지 않고 무결성을 유지하는것
//---> atomic vs nonatomic 알아보기


How To Use

extension UIView {

	/// 1. 런타임시 미리 선언 된 키 값이 있어야 한다.
	private struct AssociatedKeys {
    	static let tempStr: String = "temp_associated"
    }
    
    var tempStr: String? {
    	get {
        	/// 2. 키에 저장 된 값을 불러옵니다.
        	return objc_getAssociatedObject(self, &AssociatedKeys.tempStr) as? String
        }
        set {
        	/// 3. 키에 새로운 값을 저장합니다.
            /// 새로운 값이 nil일 경우 해당 키에 대한 객체는 삭제됩니다.
        	objc_setAssociatedObject(self, &AssociatedKeys.tempStr, newValue, .OBJC_ASSOCIATION_RETAIN)
        }
    }
}







reference

https://developer.apple.com/documentation/objectivec/objc_associationpolicy
https://mrgamza.tistory.com/590
https://lidium.tistory.com/54
https://jintaewoo.tistory.com/52

profile
iOS Developer 💻

0개의 댓글