티스토리 뷰

Mobile/iOS

Swift. Method Swizzle.

out of coding 2021. 1. 3. 19:54

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 하여서 만든 클래스의 이름등을 이용해서 로그를 남기도록 개발하여 두었더군요.

그 부분은 궁금하시면 댓글 남겨주세요.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함