Spotlight 용 SIMBL 플러그인을 작성 중이며 내부 Spotlight 유형의 하위 클래스를 만들려고합니다. class-dump을 사용하여 실행 파일에서 직접 헤더를 가져올 수는 있지만 링크 할 정적 라이브러리가 없으므로 클래스가 런타임에 사용 가능할지라도 해당 내부 클래스 중 하나의 하위 클래스를 컴파일 할 수 없습니다. 나는 subclassing classes at runtime에 마이크 애쉬의 지시를 따라 왔지만 꽤 불편합니다. 링크 시간에 수퍼 클래스를 사용할 수없는 상태에서 Objective-C 클래스의 하위 클래스를 만들 수있는 방법이 있습니까?서브 클래스 Objective-C 클래스는 슈퍼 클래스와 연결하지 않고?
1
A
답변
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
+load
또는
+initialize
이전의 어느 시점에서든이 작업을 수행 할 때는주의해야합니다.
super
에서 메서드를 호출하기가 어려울 수 있지만 NSObject
(또는 구현에서 상속하도록 선택한 모든 클래스)에 범주를 선언하면 해결할 수 있습니다.
NSClassFromString() 및 objc_allocateClassPair()는 내 친구입니다. 아니요, 컴파일 할 때처럼 편리하지는 않습니다. –
아, 아아. 더 간단한 방법이 있었으면 좋았을 텐데 ... – nate777