Как выделить динамический типизированный объект - PullRequest
7 голосов
/ 26 февраля 2009

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

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

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

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

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

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

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

}

Ответы [ 2 ]

19 голосов
/ 26 февраля 2009

Я понятия не имею, что пытается делать код, который у вас там есть, он не синтаксически допустим, и манипулирование представлениями не имеет ничего общего с вашими вопросами. В любом случае, если вы действительно не знаете тип, вы обычно используете "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];
}
0 голосов
/ 26 февраля 2009

Вот что у меня сейчас

- (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];    
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...