/ / Methode Swizzling für NSArray - Ziel-c, Methoden, Nsarray, Swizzling

Methodenwechsel für NSArray - objective-c, Methoden, nsarray, swizzling

Ich versuche etwas auf einem NSArray und mir zu debuggenIch kann nicht einmal herausfinden, was der Zeiger auf das Array ist, das das Problem verursacht, und ich habe keine Ahnung, warum es passiert einige interne NSView-Methode ... trotzdem habe ich swizzling objectAtIndex ausprobiert: mit meiner eigenen, aber es wird nicht funktionieren. Hier "s was ich mache":

Class arrayClass = [NSArray class];
Method originalMethod = class_getClassMethod(arrayClass, @selector(objectAtIndex:));
Method categoryMethod = class_getClassMethod(arrayClass, @selector(objectAtIndexAlt:));
method_exchangeImplementations(originalMethod, categoryMethod);

und es funktioniert nicht. Weiß jemand warum?

Update: Danke Dave, das war wahrscheinlich das Problem. Ich hatte auch getClassMethod anstelle von Instanz. Wie auch immer, hier ist was ich am Ende getan habe:

#import <Cocoa/Cocoa.h>
#import <objc/runtime.h>

@interface NSArray (Swizzle)
- (void)objectAtIndexAlt:(NSUInteger)index;
@end
@implementation NSArray (Swizzle)
- (void)objectAtIndexAlt:(NSUInteger)index
{
if ([self count] <= index)
NSLog(@"%s self = %@, pointer = %p, index = %lu", __FUNCTION__, self, self, (unsigned long)index);
return [self objectAtIndexAlt:index];
}
@end

int main(int argc, char *argv[])
{
Class arrayClass = NSClassFromString(@"__NSArrayM");
Method originalMethod = class_getInstanceMethod(arrayClass, @selector(objectAtIndex:));
Method categoryMethod = class_getInstanceMethod([NSArray class], @selector(objectAtIndexAlt:));
method_exchangeImplementations(originalMethod, categoryMethod);
return NSApplicationMain(argc,  (const char **) argv);
}

Antworten:

7 für die Antwort № 1

Wenn Sie ein Array erstellen, erhalten Sie keine Instanz von NSArray. Sie bekommen normalerweise eine NSCFArray, obwohl es andere private Klassen gibt, wie __NSArrayM und so weiter.

Das ist, weil NSArray ist ein Klassencluster.


0 für die Antwort № 2

Dave DeLong hat recht. Ich denke, du suchst nach einer Möglichkeit, Cluster zu schwenken, schau dir das an NSObjectSafeist ein winziges Open-Source-Framework, an dem die meisten häufig verwendeten Funktionen des Foundation-Containers wie [NSArray objectAtIndex:] hängen.