12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- //
- // Licensed under the terms in License.txt
- //
- // Copyright 2010 Allen Ding. All rights reserved.
- //
- #import "KWInvocationCapturer.h"
- #import "KWWorkarounds.h"
- #import "NSInvocation+KiwiAdditions.h"
- @implementation KWInvocationCapturer
- #pragma mark - Initializing
- - (id)initWithDelegate:(id)aDelegate {
- return [self initWithDelegate:aDelegate userInfo:nil];
- }
- - (id)initWithDelegate:(id)aDelegate userInfo:(NSDictionary *)aUserInfo {
- delegate = aDelegate;
- userInfo = aUserInfo;
- return self;
- }
- + (id)invocationCapturerWithDelegate:(id)aDelegate {
- return [self invocationCapturerWithDelegate:aDelegate userInfo:nil];
- }
- + (id)invocationCapturerWithDelegate:(id)aDelegate userInfo:(NSDictionary *)aUserInfo {
- return [[self alloc] initWithDelegate:aDelegate userInfo:aUserInfo];
- }
- #pragma mark - Properties
- @synthesize delegate;
- @synthesize userInfo;
- #pragma mark - Capturing Invocations
- - (void)KW_captureInvocation:(NSInvocation *)anInvocation {
- [self.delegate invocationCapturer:self didCaptureInvocation:anInvocation];
- }
- #pragma mark - Handling Invocations
- - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
- return [self.delegate invocationCapturer:self methodSignatureForSelector:aSelector];
- }
- - (void)forwardInvocation:(NSInvocation *)anInvocation {
- #if KW_TARGET_HAS_INVOCATION_EXCEPTION_BUG
- @try {
- #endif // #if KW_TARGET_HAS_INVOCATION_EXCEPTION_BUG
- [self KW_captureInvocation:anInvocation];
- #if KW_TARGET_HAS_INVOCATION_EXCEPTION_BUG
- } @catch (NSException *exception) {
- KWSetExceptionFromAcrossInvocationBoundary(exception);
- }
- #endif // #if KW_TARGET_HAS_INVOCATION_EXCEPTION_BUG
- }
- #pragma mark - Whitelisted NSObject Methods
- // The return values from these methods should never be needed, so just call
- // the super implementation after capturing the invocation.
- - (BOOL)isEqual:(id)anObject {
- NSInvocation *invocation = [NSInvocation invocationWithTarget:self selector:_cmd messageArguments:&anObject];
- [self KW_captureInvocation:invocation];
- return [super isEqual:anObject];
- }
- - (NSUInteger)hash {
- NSInvocation *invocation = [NSInvocation invocationWithTarget:self selector:_cmd];
- [self KW_captureInvocation:invocation];
- return [super hash];
- }
- - (NSString *)description {
- NSInvocation *invocation = [NSInvocation invocationWithTarget:self selector:_cmd];
- [self KW_captureInvocation:invocation];
- return [super description];
- }
- @end
|