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
이 코드는 단지 예제일 뿐... 응용은 알아서...
이 글은 스프링노트에서 작성되었습니다.


