Ada göre bir sınıf örneği oluşturmak mümkün müdür? Gibi bir şey:
NSString* className = @"Car";
id* p = [Magic createClassByName:className];
[p turnOnEngine];
Amaç-c'de bunun mümkün olup olmadığını bilmiyorum ama öyle görünüyor,
Yanıtlar:
id object = [[NSClassFromString(@"NameofClass") alloc] init];
NSClassFromString()
sınıf adını yanlış yazma veya var olmayan bir sınıfı kullanma riskini taşır. Bu hatayı yaparsanız, çalışma zamanına kadar öğrenemezsiniz. Bunun yerine, Class
bir değişken oluşturmak için yerleşik hedef-c türünü kullanırsanız, derleyici sınıfın var olduğunu doğrular.
Örneğin, sizin .h
:
@property Class NameOfClass;
ve sonra sizin .m
:
id object = [[NameOfClass alloc] init];
Sınıf adını yanlış yazdıysanız veya mevcut değilse, derleme sırasında bir hata alırsınız. Ayrıca bunun daha temiz bir kod olduğunu düşünüyorum.
Eğer olmadan Objective-C ile çalışıyorsanız NeXTstep
( OS X
, iOS
, GNUstep
vs) sistem veya sadece bu yöntem temizleyici olduğunu düşünüyorum, o zaman faydalanabilirler Objective-C dil çalışma zamanı kütüphanesinin API . Altında Objective-C 2.0
:
#import <objc/runtime.h>
//Declaration in the above named file
id objc_getClass(const char* name);
//Usage
id c = objc_getClass("Object");
[ [ c alloc ] free ];
Objective-C (1.0 veya adsız sürüm) altında aşağıdakileri kullanırsınız:
#import <objc/objc-api.h>
//Declaration within the above named file
Class objc_get_class( const char* name);
//Usage
Class cls = objc_get_class( "Test" );
id obj = class_create_instance( cls );
[ obj free ];
1.0
Sürümü test etmedim, ancak 2.0
şu anda üretimde olan kodda işlevi kullandım . Ben şahsen kullanan inanmak 2.0
daha az yer kaplar işlevini NS işlevinden daha müsait temizleyici eğer geçerli: the length of the name in bytes + 1 ( null terminator )
2.0 karşı API için the sum of two pointers (isa, cstring)
bir size_t length (cstring_length)
ve length of the string in bytes + 1
için NeXTSTEP
API.