# [iOS] 실행시 메소드 이름 바꾸기 (method_exchangeImplementations) 안녕하세요 __물먹고하자__ 입니다 :) Objc 코드를 Swift 전환을 하고 있는중에 이슈가 있었던 부분이 있엇는데, swizzledMethod 형식의 구현부분을 Swift 런타임때 작업하는부분이 있었다. 일부 제가 가지고있는 부분에서는 결국 사용안하기로 했는데 사용하고 있던부분을 샘플링 해서 기록겸 공유드립니다. --- ## #. 이미 정의되어 있는 메소드를 실행시 서로 바꿔준다? ## 1. method_exchangeImplementations > 💡 method_exchangeImplementations iOS 2.0 예전 Objc소스부터 있던 코드이며, method1 <-> method2를 실행을 서로 바꾸는 역할을 해준다. - class_getInstanceMethod iOS 2.0 참고 ``` swift import UIKit import ObjectiveC.runtime // 테스트용 클래스 class MyClass: NSObject { @objc dynamic func originalMethod() { print("🟢 originalMethod called") } @objc dynamic func swizzledMethod() { print("🔵 swizzledMethod called") } // static let _ = ... 으로 자동 실행 가능 static func swizzle() { guard // dealloc String으로도 쓸수있음. // let originalMethod = class_getInstanceMethod(UITextView.self, NSSelectorFromString("dealloc")) let originalMethod = class_getInstanceMethod(MyClass.self, #selector(originalMethod)), let swizzledMethod = class_getInstanceMethod(MyClass.self, #selector(swizzledMethod)) else { print("❌ Method not found") return } method_exchangeImplementations(originalMethod, swizzledMethod) print("✅ Swizzling completed") } } // Playground 실행 테스트 let obj = MyClass() print("----- Before Swizzle -----") obj.originalMethod() // 🟢 출력됨 MyClass.swizzle() // 교체 실행 print("----- After Swizzle -----") obj.originalMethod() // 이제 🔵 출력됨 (교체 성공) obj.swizzledMethod() // 반대로 🟢 출력됨 ``` --- ## 마무리 원래 목적은 UITextView+Placeholder Objc 기반 카테고리로 확장으로 했던 Class가 있는데, + (void)load 시 "dealloc" 을 swizzled 해서 KVO를 해제해주는 역할을 하고있었다. Swift 화 진행하면서 문제가 load (objc 런타임시 생성시점을 알수 있는부분)이 없기 때문에 사용하는곳에서 swizzled를 호출해줘야하는 불상사가 일어났다. 최대한 코드를 고치기 싫었고, UITextView Extention 기중 deinit도 사용할수 없어서 Custom UITextView를 만들어야 깔끔하다고 판단. 일단 급한게 아니기 때문에 문제인 런타임 로드시점을 체크를 못해서 - __method_exchangeImplementations__ - __class_getInstanceMethod__ 두가지 사용했던것만 정리해 놓았습니다. (솔직히 쓸일은 없는데, 어떻게 동작하는지는 알아두는게 좋음) 오늘은 이만~ 즐거운 코딩 되게요. 끝.

댓글
댓글 쓰기