2013-02-25 17 views
8

Nesnenin üst sýnýflarýný çalþma sýrasýnda deðiþtirmek mümkün mü? Öyleyse nasıl?Bir nesnenin üst sınıf sýnýfýný dinamik olarak deðiþtirme

+0

Bir isa swizzle örneği için http://stackoverflow.com/questions/11221110/my-isa-swizzling-breaks-kvo adresine bakın. – mttrb

+1

Ayrıca, "bir nesnenin süper sınıfı" ile ne anlama geliyor? Bir * nesnesinin * süper sınıfı yoktur. Bir nesnenin bir sınıfı vardır ve sınıfının bir süper sınıfı vardır. Bununla birlikte, eğer nesnenin sınıfının üst sınıfını değiştirirseniz, ** bu sınıfın tüm üyeleri etkilenecektir, ** sadece tek bir nesne değil. –

+2

neden birinci sınıf sınıfı mevcut değil? şimdiki sınıfa ne oldu? Dikkatlice düşünmek zorundasınız –

cevap

11

kısa bir soru, kısa cevap: Ben, bu bir REST API bağlantıları işleyen bir sınıftır var

: evet, isa

What Makes Objective C Dynamic?, page 66


bir örnek swizzling APIClient denir. Testte farklı bir sunucuya bağlanmak istiyorum. test hedefi olarak

ben swizzling alma yapmak Birim testi sınıfında 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 

alt sınıf Bu cas Ben ilk bir alt sınıfı yarattı olarak kaydetmek olduğunu

@implementation APIUnitTests 


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

//… 
@end 

Temel sınıf ve daha sonra ikinci alt sınıf ile değiştirildi. Alt sınıf aynı zamanda bir temel sınıf olduğu için, bu geçerli bir mirastır.

+1

Bu çok tehlikeli geliyor. Neden yeryüzünde istiyorsun? –

+1

eğer doğru yapılırsa çok güçlüdür, elma KVO için kullanır: http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueObserving/Articles/KVOImplementation.html – vikingosegundo

+0

Şahsen onu kontrol etmek için kullanırım code: Bazı bilgileri kayıt altına almak ve orijinal yöntemleri süper aramaları için ilgilendiğim yöntemlerin alt sınıfını ve üzerine yazdım. – vikingosegundo

İlgili konular