2013-02-25 3 views
8

런타임시 개체의 수퍼 클래스를 변경할 수 있습니까? 그렇다면 어떻게?동적으로 개체의 수퍼 클래스 변경

+0

isa swizzle의 예는 http://stackoverflow.com/questions/11221110/my-isa-swizzling-breaks-kvo를 참조하십시오. – mttrb

+1

또한 "객체의 수퍼 클래스"는 무엇을 의미합니까? * 객체 *에는 수퍼 클래스가 없습니다. 객체에는 클래스가 있고 클래스에는 수퍼 클래스가 있습니다. 그러나 개체 클래스의 수퍼 클래스를 변경하면 해당 클래스의 모든 구성원이 영향을받습니다 ** ** 단일 개체 만이 아닙니다. –

+2

수퍼 클래스가 현재 클래스가 아닌 이유는 무엇입니까? 현재 수업은 어떻게됩니까? 먼저 신중히 생각해야합니다. –

답변

11

짧은 질문, 짧은 답 : 나는, 그것은 REST-API에 연결을 처리하는 클래스입니다했다

: 예, ISA는

What Makes Objective C Dynamic?, page 66


예를 스위 즐링 APIClient라고합니다. 테스트에서 다른 서버에 연결하려고합니다. 테스트 대상에서

나는 내가 스위 즐링 # import를을 수행 단위 테스트 클래스에서 APIClient

#import "ApiClient.h" 

@interface TestApiClient : ApiClient 
//… 
@end 


@interface TestApiClient() 
@property (nonatomic, strong, readwrite) NSURL *baseURL; 

@end 


@implementation TestApiClient 

- (NSMutableURLRequest *)requestWithMethod:(NSString *)method 
             path:(NSString *)path 
           parameters:(NSDictionary *)parameters 
{ 
    self.baseURL = [NSURL URLWithString:@"http://localhost:8000/"]; 
    return [super requestWithMethod:method path:path parameters:parameters]; 
} 

@end 

를 서브 클래 싱이 CAS 내가 처음의 서브 클래스를 생성로 저장입니다

@implementation APIUnitTests 


+(void)load 
{ 
    client = [[ApiClient alloc ] init]; 
    object_setClass(client, [TestApiClient class]); 
} 

//… 
@end 

기본 클래스로 변경 한 다음 하위 클래스를 하위 클래스로 바꿉니다. 서브 클래스도 기본 클래스이므로 유효한 상속입니다.

+1

이것은 매우 위험합니다. 왜 지구상에서 너는하고 싶니? –

+1

바로 끝나면 매우 강력합니다. 사과는 KVO 용으로 사용합니다. http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueObserving/Articles/KVOImplementation.html – vikingosegundo

+0

개인적으로 검사에 사용합니다. 코드 : 나는 정보를 기록하고 super에서 원래의 메소드를 호출하기 위해 관심이있는 메소드를 서브 클래 싱하고 덮어 쓴다. – vikingosegundo

관련 문제