4

NSArray で何かをデバッグしようとしていますが、問題の原因となっている配列へのポインターが何であるかを見つけることさえできず、なぜそれが起こっているのかわかりません。objectAtIndex: (範囲外) でエラーが発生し、内部の NSView メソッドから来ているようです...とにかく、objectAtIndex: を自分でスウィズリングしようとしましたが、うまくいきません。奇妙なのは、別のクラスとメソッドを使用して同じことを行うことができ、それが正常に機能することです。これが私がスウィズルするためにしていることです:

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

そしてそれは機能していません。誰かが理由を知っていますか?

更新: Dave に感謝します。おそらくそれが問題でした。インスタンスの代わりに getClassMethod もありました。とにかく、これが私がやったことです:

#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);
}
4

2 に答える 2

8

配列を作成するとき、のインスタンスは取得しませんNSArrayNSCFArrayのような他のプライベートクラスがありますが、通常はを取得__NSArrayMします。

これNSArrayは、がクラスクラスタであるためです。

于 2011-08-28T03:02:24.177 に答える
0

デイブ・デロングは正しいです。あなたはクラスターをスウィズルする方法を探していると思います。

于 2016-01-28T13:04:03.513 に答える