[iOS] Method Swizzling

2022. 10. 12. 17:38ยท๐ŸŽ iOS & Swift
๋ชฉ์ฐจ
  1. Method Swizzling
  2. ์‚ฌ์šฉ ์ƒํ™ฉ
  3. ์‚ฌ์šฉ ๋ฐฉ๋ฒ•
  4. ์ฃผ์˜ ์‚ฌํ•ญ

Method Swizzling

Method Swizzling์€ ๊ธฐ์กด์˜ ๋ฉ”์„œ๋“œ๋ฅผ Runtime ์‹œ์— ์›ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋กœ ๋ฐ”๊พธ์–ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค.
์ผ๋ฐ˜์ ์œผ๋กœ Swizzling๋Š” ๋’ค์„ž๋‹ค, ๋’ค๋ฐ”๊พธ๋‹ค์˜ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


[์ถœ์ฒ˜] : Swift ) Method Swizzling


์‚ฌ์šฉ ์ƒํ™ฉ

๋Ÿฐํƒ€์ž„ ์‹œ์— ๋ฉ”์„œ๋“œ๋ฅผ ๋ฐ”๊ฟ€ ์ผ์ด ํ•„์š”ํ• ๊นŒ์š”? ์ง์ ‘ ์‚ฌ์šฉํ•  ์ผ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์žฅ ์™€๋‹ฟ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•˜๋Š”๋ฐ์š”.

  • ์•ฑ์˜ ์ƒ๋ช…์ฃผ๊ธฐ์— ์•ฑ์˜ ๋ถ„์„ ๊ธฐ๋Šฅ์„ ํ†ตํ•ฉํ•˜๊ธฐ ์œ„ํ•จ
  • ํŠน์ • ํด๋ž˜์Šค์˜ ๊ธฐ๋Šฅ์„ ํ•œ ๋ฒˆ์— ์ ์šฉํ•˜๊ธฐ ์œ„ํ•จ
  • ํŠน์ • SDK๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•  ๋•Œ, ํŠน์ • ๋ฉ”์„œ๋“œ์—์„œ ํ•ญ์ƒ ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•˜๊ณ ์ž ํ•จ

โ–ช๏ธ ๊ฐ€๋ น, ์„œ๋น„์Šค ํ”„๋กœ์ ํŠธ ๋‚ด์— GA๋ฅผ ๋ถ™์—ฌ์•ผ ํ•˜๊ณ  ํ™”๋ฉด๋งˆ๋‹ค GA ๊ด€๋ จ API๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค๊ณ  ํ•˜๋ฉด viewWillAppear ๋ฉ”์„œ๋“œ ์•ˆ์— ํ˜ธ์ถœ ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์ค„ ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”. ๋งŒ์•ฝ ViewController๊ฐ€ ๋งŒ์•ฝ ์ˆ˜๋ฐฑ ๊ฐœ ์ด์ƒ์ด๋ผ๋ฉด ํ•˜๋‚˜์”ฉ ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์ฃผ๋Š” ๊ฒƒ์€ ์ •๋ง ๋น„ํšจ์œจ์ ์ธ ์ž‘์—…์ด ๋ฉ๋‹ˆ๋‹ค.

โ–ช๏ธ ๋˜๋Š” ๋กœ๊ทธ๋ฅผ ์ผ๊ด€์ ์œผ๋กœ ์ฐ๊ณ  ์‹ถ์„ ๋•Œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์š”. ์—ญ์‹œ๋‚˜ ViewController ์ˆ˜๊ฐ€ ๋งŽ๋‹ค๋ฉด ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์š”. ์„œ๋ธŒํด๋ž˜์‹ฑ(์ƒ์†)์œผ๋กœ๋„ ํ•ด๊ฒฐ์€ ํ•  ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ, Method Swizzling์ด ์ข€ ๋” ๊ฐ„ํŽธํ•  ๊ฒƒ ๊ฐ™์•„์š”.

โ–ช๏ธ ๊ทธ๋ฆฌ๊ณ  ์ตœ๊ทผ์— ๋“ค์—ˆ๋˜ ์ปจํผ๋Ÿฐ์Šค(๐ŸŒฑ์ƒˆ์‹น)์—์„œ ๋“ฃ๊ฒŒ๋œ ๋‚ด์šฉ์ธ๋ฐ ์ด๋Ÿฐ ์ƒํ™ฉ์— ์ •๋ง ์œ ์šฉํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค๊ณ  ๋А๊ผˆ๋˜ ๋‚ด์šฉ์„ ์†Œ๊ฐœํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋™์•ˆ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ๋‚˜ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ์ฒ˜๋Ÿผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•˜๊ฑฐ๋‚˜ ๊ทœ๋ชจ๊ฐ€ ๊ทธ๋ฆฌ ํฌ์ง€ ์•Š์€ ์ƒํ™ฉ์ด๋ผ๋ฉด ํ™”๋ฉด์— ๋Œ€์‘๋˜๋Š” ViewController์˜ ์ด๋ฆ„์„ ์ฐพ๋Š” ๊ฒƒ์€ ์–ด๋ ต์ง€ ์•Š์„ ์ˆ˜ ์žˆ์–ด์š”. ๊ทธ๋Ÿฌ๋‚˜ ํšŒ์‚ฌ์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๋ฉด ViewController์˜ ์ˆ˜๊ฐ€ ๊ต‰์žฅํžˆ ๋Š˜์–ด๊ฐ€๊ฒŒ ๋˜์ฃ . ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ViewController๊ฐ€ ์–ด๋–ค ํ™”๋ฉด์— ๋Œ€์‘๋˜๋Š” ๊ฑด์ง€ ์ฐพ๊ธฐ๊ฐ€ ๊ต‰์žฅํžˆ ์–ด๋ ค์›Œ์š”. print๋ฌธ์„ ํ™”๋ฉด ์ง„์ž…ํ•  ๋•Œ๋งˆ๋‹ค ์ฐ๋Š” ๊ฒƒ์€ ์ƒ๊ฐ๋ณด๋‹ค ๋”์ฐํ•˜์ฃ . ์ด ๋•Œ Method Swizzling์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ํฌ๊ฒŒ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์š”. (+ LLDB์™€ ๊ฐ™์ด ์ด์šฉ์„ ํ•œ๋‹ค๋ฉด ๋” ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)


์‚ฌ์šฉ ๋ฐฉ๋ฒ•

extension UIViewController {

    // ๋ฉ”์„œ๋“œ ๊ต์ฒด
    class func swizzleMethod() {
        let origin = #selector(viewWillAppear)
        let swizzle = #selector(swizzleViewWillAppear)

        guard
            let originMethod = class_getInstanceMethod(UIViewController.self, origin),
            let swizzleMethod = class_getInstanceMethod(UIViewController.self, swizzle)
        else { return }
    }

    // ๊ต์ฒดํ•  ๋ฉ”์„œ๋“œ
    @objc public func swizzleViewWillAppear(animated: Bool) {
        print("๐Ÿ”€ - swizzleViewWillAppear")
    }
}
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // ...
    UIViewController.swizzleMethod()
    // ...
    return true
}

์ฃผ์˜ ์‚ฌํ•ญ

  • iOS ๋ฒ„์ „์— ๋”ฐ๋ผ์„œ ๋™์ž‘์ด ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ์—๋Ÿฌ๊ฐ€ ๋‚  ๊ฐ€๋Šฅ์„ฑ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. (์ž„์˜๋กœ ๋ณ€๊ฒฝ์„ ์‹œ๋„ํ–ˆ๊ธฐ ๋•Œ๋ฌธ)
  • ํƒ€ SDK์—์„œ๋„ Method Swizzling์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ๊ณ , ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ๋” ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


Firebase Cloud Messaging์—์„œ๋„ Method swizzling์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด์š”. FCM Token ํ•ธ๋“ค๋ง์„ ์ •์ƒ์ ์œผ๋กœ ํ•  ์ˆ˜ ์—†์„ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, Method swizzling์˜ ์‚ฌ์šฉ์„ ์ค‘์ง€ํ•˜์ง€๋ง๋ผ๊ณ  ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ๋„ค์š”.

'๐ŸŽ iOS & Swift' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[LLDB ๊ด€๋ จ ๋นŒ๋“œ ๋ฌธ์ œ] warning: libobjc.A.dylib is being read from process memory. This indicates that LLDB could not find the on-disk shared cache for this device. This will likely reduce debugging performance.  (1) 2022.10.12
[iOS] Date compare(_:) ๋ฉ”์„œ๋“œ  (0) 2022.10.12
[์˜ค์˜คํˆฌ๋‘ 4ํŽธ] ํ”„๋กœ์ ํŠธ ํšŒ๊ณ  ๋ฐ ์ถœ์‹œ ํ›„๊ธฐ  (2) 2022.10.05
[์˜ค์˜คํˆฌ๋‘ 3ํŽธ] ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ ๊ทธ๋ฆฌ๊ณ  ๊ฐœ๋ฐœ..  (3) 2022.10.04
[์˜ค์˜คํˆฌ๋‘ 2ํŽธ] ๋””์ž์ธ... ๋””์ž์ธ ์‹œ์Šคํ…œ... ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“ˆํ™”.  (0) 2022.10.04
  1. Method Swizzling
  2. ์‚ฌ์šฉ ์ƒํ™ฉ
  3. ์‚ฌ์šฉ ๋ฐฉ๋ฒ•
  4. ์ฃผ์˜ ์‚ฌํ•ญ
'๐ŸŽ iOS & Swift' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [LLDB ๊ด€๋ จ ๋นŒ๋“œ ๋ฌธ์ œ] warning: libobjc.A.dylib is being read from process memory. This indicates that LLDB could not find the on-disk shared cache for this device. This will likely reduce debugging performance.
  • [iOS] Date compare(_:) ๋ฉ”์„œ๋“œ
  • [์˜ค์˜คํˆฌ๋‘ 4ํŽธ] ํ”„๋กœ์ ํŠธ ํšŒ๊ณ  ๋ฐ ์ถœ์‹œ ํ›„๊ธฐ
  • [์˜ค์˜คํˆฌ๋‘ 3ํŽธ] ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ ๊ทธ๋ฆฌ๊ณ  ๊ฐœ๋ฐœ..
taeeekki
taeeekki
๐ŸŒฑiOS ๊ฐœ๋ฐœ์ž๋ฅผ ๊ฟˆ๊พธ๋Š” ํ•™์ƒ์ด ๋งŒ๋“œ๋Š” ๋ธ”๋กœ๊ทธ
taeeekki
taekki.dev
taeeekki
์ „์ฒด
์˜ค๋Š˜
์–ด์ œ
  • All (130)
    • ๐ŸŒฑ SeSAC (40)
    • โ˜€๏ธ 100DaysOfSwift (18)
    • ๐ŸŽ iOS & Swift (60)
    • ๐Ÿ“ฉ Essay (3)
    • ๐ŸŽ Tip (4)
    • ๐ŸŒˆ UIUX (2)
    • ๐Ÿง OOP (1)
    • ๐Ÿฅณ Side Project (0)
    • โœจ Problem Solving (1)
    • ๐Ÿ“ Note (1)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • ํƒœ๊ทธ
  • ๋ฐฉ๋ช…๋ก

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

ํƒœ๊ทธ

commit
๊นƒํ—ˆ๋ธŒ
iOS H.I.G
CollectionView
OOTD
๊ฐœ์ธ ์•ฑ ์ถœ์‹œ
swift
์Šค์œ„ํ”„ํŠธ ๋ฌธ๋ฒ•
์†ํŠธ
iOS ์•ฑ ์ถœ์‹œ
github
์˜ค์˜คํˆฌ๋‘
github tip
์˜ต์…”๋„
๊ฐœ๋ฐœ
Realm
Diary App
TIL
GIT
์Šค์œ„ํ”„ํŠธ
IOS
100DaysOfSwift
ํด๋กœ์ €
tableView
SeSAC
์Šค์œ„ํ”„ํŠธ๋ฌธ๋ฒ•
PageViewController
URLSession
iOS UIUX
network

์ตœ๊ทผ ๋Œ“๊ธ€

์ตœ๊ทผ ๊ธ€

hELLOยท Designed By์ •์ƒ์šฐ.v4.5.3
taeeekki
[iOS] Method Swizzling
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”

๋‹จ์ถ•ํ‚ค

๋‚ด ๋ธ”๋กœ๊ทธ

๋‚ด ๋ธ”๋กœ๊ทธ - ๊ด€๋ฆฌ์ž ํ™ˆ ์ „ํ™˜
Q
Q
์ƒˆ ๊ธ€ ์“ฐ๊ธฐ
W
W

๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๊ธ€

๊ธ€ ์ˆ˜์ • (๊ถŒํ•œ ์žˆ๋Š” ๊ฒฝ์šฐ)
E
E
๋Œ“๊ธ€ ์˜์—ญ์œผ๋กœ ์ด๋™
C
C

๋ชจ๋“  ์˜์—ญ

์ด ํŽ˜์ด์ง€์˜ URL ๋ณต์‚ฌ
S
S
๋งจ ์œ„๋กœ ์ด๋™
T
T
ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ ์ด๋™
H
H
๋‹จ์ถ•ํ‚ค ์•ˆ๋‚ด
Shift + /
โ‡ง + /

* ๋‹จ์ถ•ํ‚ค๋Š” ํ•œ๊ธ€/์˜๋ฌธ ๋Œ€์†Œ๋ฌธ์ž๋กœ ์ด์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ‹ฐ์Šคํ† ๋ฆฌ ๊ธฐ๋ณธ ๋„๋ฉ”์ธ์—์„œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.