A mail exchange on the Cocoa Developers mailing list made me dig out some old code I had lying around here from a company long deceased and by an unspecified author, who I suspect might have been him. I fixed it up a little and here it is. Don't complain if it's slowing down your code :P
#import <Foundation/Foundation.h> @interface NSObject ( MullePreviousIMP) + (IMP) mullePreviousInstanceMethodForSelector:(SEL) sel; @endand the implementation
#import "NSObject+MullePreviousIMP.h"
#import <objc/objc-class.h>
@implementation NSObject ( MullePreviousIMP)
+ (IMP) mullePreviousInstanceMethodForSelector:(SEL) sel
{
struct objc_method_list *mlist;
struct objc_method *p;
void *rover;
int i;
BOOL flag;
IMP imp;
Class curClass;
flag = NO;
rover = 0;
imp = [self instanceMethodForSelector:sel];
for( curClass = self; curClass; curClass = [curClass superclass])
{
while( (mlist = class_nextMethodList( curClass, &rover)) != NULL)
{
for( i = mlist->method_count - 1; i >= 0 ; i--)
{
p = &mlist->method_list[ i];
if( p->method_name == sel)
{
if( p->method_imp == imp)
{
flag = YES;
break;
}
if( flag)
return( p->method_imp);
break;
}
}
}
}
return( NULL);
}
Here is an archive with some test code: MullePreviousIMP.tgz