2011-08-28 3 views
4

NSArray에서 디버깅을 시도하고 있는데도 문제의 원인이되는 배열에 대한 포인터가 무엇인지 알 수 없기 때문에 왜 이런 일이 발생하는지 알 수 없습니다. objectAtIndex에 대한 오류가 발생했습니다. (범위를 벗어났습니다.) 내부 NSView 메서드에서 오는 것 같습니다 ... 어쨌든, 내 자신과 함께 swizzling objectAtIndex를 시도했지만 작동하지 않습니다. 이상한 점은 다른 클래스와 메서드로도 같은 일을 할 수 있다는 것입니다. 다음은 내가 혼란스러워하는 일입니다.NSArray에 대한 메서드 swizzling

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

답변

7

당신이 배열을 만들 때 NSArray의 인스턴스를하지 않습니다. __NSArrayM 등과 같이 다른 개인 클래스가 있지만 일반적으로 NSCFArray이 표시됩니다.

NSArrayclass cluster이기 때문입니다.

0

데이브 DeLong 맞습니다. 당신이 클러스터를 swizzle하는 방법을 찾고 있다고 생각합니다 NSObjectSafe에서보세요, [NSArray objectAtIndex :]와 같은 Foundation 컨테이너의 기능을 가장 많이 사용하는 작은 오픈 소스 프레임 워크입니다