lunchScreen/Interview_Questions

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

Opened this issue · 2 comments

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

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()

이를 호출하는 것으로 작업을 처리할 수 있습니다.

  • 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")
    }
}