method swizzling이 무엇이고, 어떨 때 사용하는지 설명하시오.
Opened this issue · 2 comments
sustainable-git commented
method swizzling이 무엇이고, 어떨 때 사용하는지 설명하시오.
inuinseoul commented
Method Swizzling은 원래의 메서드를 runtime에 원하는 메서드로 변경해 사용할 수 있도록 하는 기법입니다. UIViewController의 viewWillAppear같은 메서드를 원하는 메서드로 변경해 여러 ViewController에 한번에 작업을 수행하는 방식으로도 사용이 가능합니다. (앱 분석기능을 적용하는 경우 여러 ViewController에 같은 동작을 수행해야하는 경우가 있습니다. 이럴 때 하나씩 적용하는 것보단, Method Swizzling으로 한번에 처리하는 것이 효율적인 것이지요.)
import UIKit
extension UIViewController {
static func methodSwizzling() {
let originalSelector = #selector(viewWillAppear)
let swizzledSelector = #selector(swizzledViewWillAppear)
if let origin = class_getInstanceMethod(UIViewController.self, originalSelector),
let swizzle = class_getInstanceMethod(UIViewController.self, swizzledSelector) {
method_exchangeImplementations(origin, swizzle)
}
}
@objc
func swizzledViewWillAppear() {
print("swizzledViewWillAppear")
}
}
Method Swizzing은 위와 같은 코드로 적용이 가능합니다. 이렇게하고 앱의 시작과정에서
UIViewController.methodSwizzling()
이를 호출하는 것으로 작업을 처리할 수 있습니다.
sustainable-git commented
- Method Swizzling은 method를 runtime에 변경하여 사용하는 기법입니다.
- 일반적으로는 앱에 분석기능을 통합하기 위해 사용한다고 합니다.
extension UIViewController {
static let swizzledMethod: Void = {
let originalMethod = class_getInstanceMethod(UIViewController.self, #selector(viewWillAppear))
let swizzledMethod = class_getInstanceMethod(UIViewController.self, #selector(myViewWillAppear))
if let origin = originalMethod, let swizzle = swizzledMethod {
method_exchangeImplementations(origin, swizzle)
}
}()
@objc func myViewWillAppear() {
print("test")
}
}