Respostas:
id object = [[NSClassFromString(@"NameofClass") alloc] init];
NSClassFromString()
corre o risco de digitar incorretamente o nome da classe ou usar uma classe que não existe. Você não descobrirá até o tempo de execução se cometer esse erro. Em vez disso, se você usar o tipo objetivo-c interno de Class
para criar uma variável, o compilador verificará se a classe existe.
Por exemplo, em seu .h
:
@property Class NameOfClass;
e então em seu .m
:
id object = [[NameOfClass alloc] init];
Se você digitou incorretamente o nome da classe ou se ele não existe, você receberá um erro em tempo de compilação. Também acho que este é um código mais limpo.
Se você está trabalhando com Objective-C sem a NeXTstep
( OS X
, iOS
, GNUstep
sistema etc) ou você só acho que este método é mais limpo, em seguida, você poderia utilizar a API da biblioteca de tempo de execução linguagem Objective-C . Sob 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 ];
No Objective-C (1.0 ou versão sem nome), você utilizaria o seguinte:
#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 ];
Não testei a 1.0
versão, mas usei a 2.0
função em código que agora está em produção. Pessoalmente, acredito que usar a 2.0
função é mais limpo, se disponível, do que a função NS, pois consome menos espaço: the length of the name in bytes + 1 ( null terminator )
para a API 2.0 versus the sum of two pointers (isa, cstring)
, a size_t length (cstring_length)
, e length of the string in bytes + 1
para a NeXTSTEP
API.