develop

Swizzling 본문

iOS

Swizzling

pikachu987 2020. 12. 31. 11:14
반응형

스위즐링은 런타임에 해당 메서드를 내가 원하는 메서드로 바꿀 수 있다.

extension UIViewController {
    @objc private func customViewWillAppear(_ animated: Bool) {
        print("customViewWillAppear 호출")

    }

    public static func swizzleMethodInitialize() {
        let originalSelector = #selector(viewWillAppear(_:))
        let swizzledSelector = #selector(customViewWillAppear(_:))

        let originalMethod = class_getInstanceMethod(UIViewController.self, originalSelector)
        let swizzledMethod = class_getInstanceMethod(UIViewController.self, swizzledSelector)

        if let originalMethod = originalMethod, let swizzledMethod = swizzledMethod {
            method_exchangeImplementations(originalMethod, swizzledMethod)
        }
    }
}
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.

        UIViewController.swizzleMethodInitialize()

        return true
    }
}

이렇게 하면 UIViewController에서 viewWillAppear가 호출이 될때 내가 만든 메서드가 호출이 된다.

 

 

Swizzling할 메서드의 Selector를 가져온다.

let originalSelector = #selector(viewWillAppear(_:))
let swizzledSelector = #selector(customViewWillAppear(_:))

 

UIViewController 클래스의 인스턴스메서드를 가져온다.

let originalMethod = class_getInstanceMethod(UIViewController.self, originalSelector)
let swizzledMethod = class_getInstanceMethod(UIViewController.self, swizzledSelector)

 

originalMethod와 swizzledMethod를 바꾼다.

method_exchangeImplementations(originalMethod, swizzledMethod)

 

주의할점

1. firebase, analytics 등의 프레임워크에서 스위즐링을 이미 사용하고 있을 수 있다.

2. 디버깅하기가 어려워진다.

반응형

'iOS' 카테고리의 다른 글

Subscript Optional  (0) 2021.01.02
Subscript  (0) 2021.01.01
IBDesignable, IBInspectable  (0) 2020.12.30
Image Face Detector 사진에서 얼굴 찾기  (0) 2020.12.30
Text Gradation 텍스트에 그라데이션 추가  (0) 2020.12.29
Comments