lunchScreen / Interview_Questions

기술면접을 준비하는 버디들
73 stars 10 forks source link

method swizzling이 무엇이고, 어떨 때 사용하는지 설명하시오. #132

Open sustainable-git opened 2 years ago

inuinseoul commented 2 years ago

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 2 years ago
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")
    }
}