외규장각 도서 환수 모금 캠페인
BLOG main image
분류 전체보기 (45)
컴퓨팅환경 (18)
프로그래밍 (18)
놀이 (2)
잡담 (7)
«   2010/03   »
  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      
10,199 Visitors up to today!
Today 0 hit, Yesterday 28 hit
daisy rss
meet me at me2DAY
나눔글꼴 내려받기
tistory
2009/05/22 12:08

이런 거를 Hooking이라고 표현해도 되는지 잘 모르겠다만...

가끔씩 카테고리를 사용해서 기존의 메소드를 덮어쓰는게 아니라 기존의 메소드를 그냥 놔두고 나의 코드를 삽입하고 싶은 경우가 있을 수 있다. LD_PRELOAD를 이용해서 원래 함수의 실행을 가로막고 뭔가 할 수 있는 것처럼...

Objective-C Runtime API를 이용하면 가능하다. 원리는 기존 메소드를 다른 이름으로 복사하고 새로운 메소드를 같은 이름으로 추가하는 것이다. 그러면 새로운 메소드에서 필요시 기존 메소드를 호출할 수 있다.

다음 예제는 NSView의 -addSubview: 메소드앞단에 로그찍는 코드를 끼워넣은 것이다.

#import <objc/runtime.h>

@implementation NSView (Logging)

static void addSubviewLogging(id self, SEL _cmd, NSView *aView)
{
    NSLog(@"-[%@ addSubview:%@]", self, aView);

    [self addSubviewReal:aView];
}

+ (void)load
{
    class_addMethod(self, @selector(addSubviewReal:), [self instanceMethodForSelector:@selector(addSubview:), "v@:@");
    class_replaceMethod(self, @selector(addSubview:), (IMP)addSubviewLogging, "v@:@");
}

@end

이 코드는 단지 예제일 뿐... 응용은 알아서...

 

이 글은 스프링노트에서 작성되었습니다.

prev"" #1 ... #2 #3 #4 #5 #6 #7 #8 #9 #10 ... #45 next