1

Spotlight 용 SIMBL 플러그인을 작성 중이며 내부 Spotlight 유형의 하위 클래스를 만들려고합니다. class-dump을 사용하여 실행 파일에서 직접 헤더를 가져올 수는 있지만 링크 할 정적 라이브러리가 없으므로 클래스가 런타임에 사용 가능할지라도 해당 내부 클래스 중 하나의 하위 클래스를 컴파일 할 수 없습니다. 나는 subclassing classes at runtime에 마이크 애쉬의 지시를 따라 왔지만 꽤 불편합니다. 링크 시간에 수퍼 클래스를 사용할 수없는 상태에서 Objective-C 클래스의 하위 클래스를 만들 수있는 방법이 있습니까?서브 클래스 Objective-C 클래스는 슈퍼 클래스와 연결하지 않고?

+2

NSClassFromString() 및 objc_allocateClassPair()는 내 친구입니다. 아니요, 컴파일 할 때처럼 편리하지는 않습니다. –

+0

아, 아아. 더 간단한 방법이 있었으면 좋았을 텐데 ... – nate777

답변

0

이것은 전적으로 가능하며 실제로 그렇게하기가 어렵지 않습니다. 여기 NSValue와 간단한 예는 다음과 같습니다되지 않는 동안

@interface MySubclass : NSObject 

-(void) someMethod; 

@end 

@implementation MySubclass 

+(void) load { 
#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Wdeprecated" 

    class_setSuperclass(self, NSClassFromString(@"NSValue")); 

#pragma clang diagnostic pop 
} 

-(void) someMethod { 
    NSLog(@"%@", [self superclass]); 
} 

-(const char *) objCType { 
    return @encode(int); 
} 

-(void) getValue:(void *)value { 
    if (value) { 
     *((int *) value) = 10; 
    } 
} 

@end 

int main() { 
    MySubclass *theSubclass = [MySubclass new]; 
    [theSubclass someMethod]; 

    NSLog(@"%i", [theSubclass isKindOfClass:[NSValue class]]); 
} 

class_setSuperclass

는 여전히 OS X 10.10의 같은 구현이 있으며 클래스가 등록 된 후 수행 할 수 있습니다. 클래스의 수퍼 클래스를 변경 한 결과를 해당 클래스의 인스턴스를 게시 한 후 완전히 조사하지는 않았으므로 +load 또는 +initialize 이전의 어느 시점에서든이 작업을 수행 할 때는주의해야합니다.

super에서 메서드를 호출하기가 어려울 수 있지만 NSObject (또는 구현에서 상속하도록 선택한 모든 클래스)에 범주를 선언하면 해결할 수 있습니다.