Notice
Recent Posts
Recent Comments
Link
관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - Swift] objc_getAssociatedObject, objc_setAssociatedObject 사용 방법 본문

iOS 응용 (swift)

[iOS - Swift] objc_getAssociatedObject, objc_setAssociatedObject 사용 방법

jake-kim 2022. 12. 8. 23:08

objc_setAssociatedObject, objc_getAssociatedObject

  • key-value 쌍으로 특정 값을 저장하여 사용
    • extension에서는 stored property를 지정하지 못하지만, 이 AssociatedObject를 사용하면 stored property처럼 따로 프로퍼티를 추가하고 접근도 가능

AssociatedObject 주요 메소드

  • 객체를 저장하는 메소드
// https://developer.apple.com/documentation/objectivec/1418509-objc_setassociatedobject

func objc_setAssociatedObject(
    _ object: Any,
    _ key: UnsafeRawPointer,
    _ value: Any?,
    _ policy: objc_AssociationPolicy
)
  • 객체를 가져오는 메소드
// https://developer.apple.com/documentation/objectivec/1418865-objc_getassociatedobject

func objc_getAssociatedObject(
    _ object: Any,
    _ key: UnsafeRawPointer
) -> Any?
  • object를 제거하는 메소드
https://developer.apple.com/documentation/objectivec/1418683-objc_removeassociatedobjects

func objc_removeAssociatedObjects(_ object: Any)
  • 애플 문서에 따르면, removeAssociatedObjects를 사용하면 의도하지 않은 다른 값도 지워질 수 있으므로 objc_setAssociatedObject를 사용하여 특정 객체에 대해서 nil로 할당하여 지울것

https://developer.apple.com/documentation/objectivec/1418683-objc_removeassociatedobjects

AssociatedObject로 extension에 stored property같은 프로퍼티 넣기

  • 구현 방법은 AssociatedKeys를 정의 한 후, computed property로 이 값을 set, get 할 수 있도록 구현
extension UIViewController {
  private struct AssociatedKeys {
    static var myValue = "abc"
  }
  
  var myValue: String? {
    get {
      objc_getAssociatedObject(
        self, &AssociatedKeys.myValue) as? String
    }
    set {
      objc_setAssociatedObject(
        self,
        &AssociatedKeys.myValue,
        newValue,
        .OBJC_ASSOCIATION_RETAIN_NONATOMIC
      )
    }
  }
}
  • 사용할땐 computed property 그대로 사용
let vc = UIViewController()
vc.myValue = "jake"
print(vc.myValue) // jake
  • 제거할땐 nil 대입
vc.myValue = nil

* 참고

https://developer.apple.com/documentation/objectivec/1418683-objc_removeassociatedobjects

https://developer.apple.com/documentation/objectivec/1418865-objc_getassociatedobject

https://developer.apple.com/documentation/objectivec/1418509-objc_setassociatedobject

 

Comments