Я понятия не имею, что пытается делать код, который у вас там есть, он не синтаксически допустим, и манипулирование представлениями не имеет ничего общего с вашими вопросами. В любом случае, если вы действительно не знаете тип, вы обычно используете "id", который является приведением типа к "void *" для codegen. Он имеет специальное свойство, которое, как предполагается, получает любое сообщение, поэтому он не вызывает предупреждения компилятора для неизвестных сообщений.
Для того, чтобы создать экземпляр класса, вам просто нужно держать для него объект «Класс». В Objective C все экземпляры класса ссылаются на объект Class (указатель isa в устаревшей среде выполнения), который также отвечает на методы. Иными словами, в следующем коде:
NSArray *myObject = [[NSArray alloc] init];
NSArray на самом деле является объектом. Так что это сгенерирует эквивалентные результаты кода:
Class myClass = [NSArray class];
NSArray *myObject = [[myClass alloc] init];
или даже
Class myClass = NSClassFromString(@"NSArray");
NSArray *myObject = [[myClass alloc] init];
Использует функцию NSClassFromString, которая входит в среду выполнения и находит класс с именем, которое вы передаете.
Все объекты возвращают свой класс, если используют класс getter, поэтому для создания экземпляра объекта того же класса, что и существующий объект, вот так:
- (void) leakObjectWithSameClassAs:(id)object {
[[[object class] alloc] init];
}