É possível criar uma instância de uma classe por nome? Algo como:
NSString* className = @"Car";
id* p = [Magic createClassByName:className];
[p turnOnEngine];
Não sei se isso é possível em c objetivo, mas parece que seria,
objective-c
reflection
Marca
fonte
fonte
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 deClass
para criar uma variável, o compilador verificará se a classe existe.Por exemplo, em seu
.h
:e então em seu
.m
: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.
fonte
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 . SobObjective-C 2.0
:No Objective-C (1.0 ou versão sem nome), você utilizaria o seguinte:
Não testei a
1.0
versão, mas usei a2.0
função em código que agora está em produção. Pessoalmente, acredito que usar a2.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 versusthe sum of two pointers (isa, cstring)
, asize_t length (cstring_length)
, elength of the string in bytes + 1
para aNeXTSTEP
API.fonte
Então, para usá-lo:
fonte