티스토리 뷰

클래스 수정없이 새로운 값을 추가하여야 하는 경우가 있습니다.

그 경우의 예로는 extension을 사용할 경우에 값을 주입시켜서 사용하여야 하는 경우가 이런 경우일것 같은데요.


이럴때 사용할수 있는것이 Associated References가 될것 같습니다.


일단 강점이라고 생각하면 클래스의 수정없이 사용할 수 있다는것인데요.

그렇다고 아주 코드를 사용하지 않고서 만들수는 없습니다.


왜냐면 키를 만들어서 넣어주어야 하거든요


사용방법은 다음과 같습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import UIKit
 
extension UIButton {
    private struct AssociatedKeys {
        static var test = "Test"
    }
    
    var test: String? {
        get {
            return (objc_getAssociatedObject(self&AssociatedKeys.test) asString)
        }
        set {
            guard let newValue = newValue as Stringelse { return }
            objc_setAssociatedObject(self&AssociatedKeys.test, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }
}
 
let button = UIButton()
button.test = "AAA"
print("\(button.test ?? "nil")")
cs


그냥 보시면 느낌이 올것입니다.

AssociatedKeys라는 struct를 만들어서 test키를 만들었습니다. 이것을 키로 사용을 하였고요.

아래쪽에 보면 get, set을 사용하여서 값을 가져오도록 하였습니다.


사용 방법은 objc_getAssociatedObject를 사용하여 값을 가져오고, objc_setAssociatedObject를 사용하여 값을 저장합니다.


결과적으로 아래에 버튼을 만들고 print한 코드는 정상적으로 동작합니다.


이상태에서 nil을 넣어주게 되면 객체에 연결된 값이 연결이 끊어지게 됩니다.


추가적으로 완전히 다 제거를 하고 싶을때는


1
objc_removeAssociatedObjects(self)
cs


이것과 같이 사용을 하면 되는데요. 이러한 경우에는 소스로 사용되는 객체의 모든 Associated References가 해제되게 되므로 주의가 필요합니다.




옵션


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    /**< Specifies a weak reference to the associated object. */
    case OBJC_ASSOCIATION_ASSIGN
 
    /**< Specifies a strong reference to the associated object. 
     *   The association is not made atomically. */
    case OBJC_ASSOCIATION_RETAIN_NONATOMIC
 
    
    /**< Specifies that the associated object is copied. 
     *   The association is not made atomically. */
    case OBJC_ASSOCIATION_COPY_NONATOMIC
 
    
    /**< Specifies a strong reference to the associated object.
     *   The association is made atomically. */
    case OBJC_ASSOCIATION_RETAIN
 
    
    /**< Specifies that the associated object is copied.
     *   The association is made atomically. */
    case OBJC_ASSOCIATION_COPY
cs


오브젝티브를 하였던 분들은 웬만하면 느낌이 올것 같네요.

assign하던가 retain하던가하는 옵션을 주는겁니다. 뒤는 원자성의 문자부분. 웬만하면 다들 nopnatomic을 사용하였죠.

성능에 이슈가 있으니까요.


'Mobile > iOS' 카테고리의 다른 글

RxSwift. Hot, Cold Observe  (0) 2018.12.21
print, debugPrint  (0) 2018.12.10
Swift. Codable Decoding (2)  (0) 2018.10.07
iOS. swift defer  (0) 2018.09.01
iOS. Custom View 만들기  (0) 2018.08.14
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함