티스토리 뷰
Objective-C는 런타임에 정적으로 메소드를 호출하는 방식으로 되어 있습니다.
우리가 호출하는 Method를 적어줘도 컴파일러가 런타임에 있는지 확인하고 호출하는거죠.
이전에는 그래서 아주 생뚱 맞은 동작이 가능하게도 할 수 있었습니다.
Int에 String을 넣어놓고 method가 없는데도 호출하게 하는...
물론 지금도 이런 동작이 가능하지만 이렇게 개발하지는 않죠.
이런 방식을 사용하기 때문에 정적으로 호출하는 방식중에 중간에 메세지를 가로채서 내가 만든 메소드를 호출할 수 있도록 할 수 있습니다.
이게 바로 메소드 스위즐링입니다.
대부분 어떻게 많이 사용하냐면 UIViewController 등에서 로그등 동일한 동작을 하고 싶을때 사용하게 됩니다.
사용방법만 알려드리고 주의 할점은 너무 남발하면 어플리케이션이 동작하는데 커다란 무리가 올수도 있고
지금 버전에서는 되는데 추후 버전에서는 동작하지 않는 문제들도 있을수 있으니 주의를 해야 합니다.
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
setSwizzle()
return true
}
func setSwizzle() {
let originalSelector = #selector(UIViewController.viewWillAppear(_:))
let swizzledSelector = #selector(swizzleViewWillAppear)
let originalMethod = class_getInstanceMethod(UIViewController.self, originalSelector)
let swizzledMethod = class_getInstanceMethod(AppDelegate.self, swizzledSelector)
if let origin = originalMethod, let swizzle = swizzledMethod {
method_exchangeImplementations(origin, swizzle)
}
}
@objc func swizzleViewWillAppear() {
print("swizzleViewWillAppear")
}
}
예를 든 부분은 UIViewController의 viewWillApper가 호출되면 swizzleViewWillAppear가 호출됩니다.
다른분들은 extension 하여서 만든 클래스의 이름등을 이용해서 로그를 남기도록 개발하여 두었더군요.
그 부분은 궁금하시면 댓글 남겨주세요.
'Mobile > iOS' 카테고리의 다른 글
iOS. UICollectionView로 Header만들고 Stretch 동작하도록 만들기 (0) | 2021.05.16 |
---|---|
swift. RealmSwift 이용하여 봅시다. (0) | 2021.04.03 |
Swift. @dynamicMemberLookup (0) | 2021.01.03 |
RxSwift, RxCocoa. Publish (0) | 2021.01.03 |
SwiftUI 처럼 Code로 View를 만들고 Preview를 바로 바로 보여주면서 개발하기 (0) | 2020.12.19 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- golang
- rxswift
- Spring
- Windows
- Gradle
- github
- MySQL
- Codable
- git
- CentOS
- tomcat
- nodejs
- Kotlin
- Python
- ios
- war
- Java
- Linux
- SWIFT
- android
- enum
- windows10
- Xcode
- intellij
- docker
- cocoapods
- go
- centos8
- ubuntu
- php
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함