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
cevap
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.
Bu çok tehlikeli geliyor. Neden yeryüzünde istiyorsun? –
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
Ş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
ObjC çalışma zamanı kullanılarak kesinlikle mümkündür, ancak biraz kıllı olacaktır ... Bu, Apple'ın dokümanlarına bir bağlantıdır: Objective-C Runtime ve kullanımının bir örneği: Objective-C Runtime Programming.
Bir isa swizzle örneği için http://stackoverflow.com/questions/11221110/my-isa-swizzling-breaks-kvo adresine bakın. – mttrb
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. –
neden birinci sınıf sınıfı mevcut değil? şimdiki sınıfa ne oldu? Dikkatlice düşünmek zorundasınız –