Как выделить объект с динамической типизацией

Я видел много разговоров о динамической типизации в objective-c. Но я не видел примеров того, что, как мне кажется, должно быть.

Допустим, у меня есть общая функция, которая должна манипулировать двумя объектами (один выделяется, а другой освобождается), а вызывающий объект сам присоединяется к вновь выделенному объекту. Оба унаследованы от class0

Не стесняйтесь интерпретировать это как хотите, если вы думаете, что это что-то объяснит !!

Если класс выбирается во время выполнения, как мне работать со списком аргументов (? На данный момент является заполнителем) Как мне выделить объект, класс которого не определен до времени выполнения?

-(void) juggle:(?*)objclass1:(?*)objclass2{

? temp = [? alloc] init];
objclass1 = temp;
[temp release];

[objclass2.view removefromsuperview];
[self.handle insertsubview:objclass1.view];

}

Ответов (2)

Решение

Я понятия не имею, что код, который у вас там, пытается сделать, он синтаксически неверен, и манипулирование представлениями не имеет ничего общего с вашими вопросами. В любом случае, если вы действительно не знаете тип, вы обычно используете «id», который является типом, приведенным к «void *» для генерации кода. Он имеет специальное свойство, предполагающее получение любого сообщения, поэтому он не вызывает предупреждений компилятора о неизвестных сообщениях.

Чтобы создать экземпляр класса, вам просто нужно держать для него объект «Class». В 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, которая входит в среду выполнения и находит класс с именем, которое вы передаете.

Все объекты возвращают свой класс, если используют средство получения класса, поэтому для создания экземпляра объекта, который является тем же классом, что и существующий объект, например:

- (void) leakObjectWithSameClassAs:(id)object {
    [[[object class] alloc] init];
}

Это то, что у меня есть сейчас

- (void)flipfromv1tov2:(UIViewController*)v1:(NSString*)nib1:(UIViewController*)v2{

    if(v1 == nil)
    {
        UIViewController *newview = [[[v1 class] alloc] initWithNibName:nib1 bundle:nil];
        v1 = newview;
        [newview release];
    }
    [v2.view removeFromSuperview];
    [self.view insertSubview:v1.view atIndex:0];    
}

Я пока не могу это проверить, потому что у меня проблема со связью ... Я добавил эту функцию в свой корневой контроллер, но по какой-то причине я получаю предупреждение о том, что функция неявно объявлена. И сборка терпит неудачу, потому что вызов функции никогда ни с чем не связан.