Цель C - определить тип класса во время выполнения - PullRequest
4 голосов
/ 07 января 2011

В интерфейсе у меня есть это:

Animal*     myPet;

Во время выполнения я могу захотеть, чтобы myPet был кошкой или собакой, которые являются подклассами Animal:

    id newPet;
    if(someCondition) {
            newPet = [[Cat alloc] initWithNibName:@"Cat" bundle:nil];
    } else {
            newPet = [[Dog alloc] initWithNibName:@"Dog" bundle:nil];
    }
    self.myPet = newPet;

Очевидно,неверно, но я надеюсь, что этого достаточно, чтобы показать, что я пытаюсь сделать.Какова лучшая практика для этого?

Ответы [ 4 ]

9 голосов
/ 07 января 2011

isKindOfClass ваш друг:

[newPet isKindOfClass:Dog.class] == NO
8 голосов
/ 07 января 2011

Сильно введите newPet как Animal * вместо id.id может содержать ссылку на экземпляр любого класса, но свойства не могут использоваться с ним (точечный синтаксис требует строго типизированного lvalue.) Поскольку и Cat, и Dog наследуются от Animal, это будетсовершенно правильно и правильно.

Если вы используете два класса, которые не имеют общего предка (прошлый NSObject), то вам следует сделать шаг назад и пересмотреть свой дизайн- почему экземпляры этих двух классов должны занимать одну и ту же переменную?

3 голосов
/ 07 января 2011
NSString *className = @"Cat";
Animal *myPet = [[NSClassFromString(className) alloc] init];

Непонятно, что вы ищете, но если вы хотите создать экземпляр класса, названного строкой, это должно быть сделано.

2 голосов
/ 07 июня 2013

Для тех, кто прибывает из Google на основании заголовка: «Определить тип класса во время выполнения», вот несколько полезных вещей, которые необходимо знать:

Вы можете вызвать метод class вNSObject* во время выполнения, чтобы получить ссылку на его класс.

[myObject class];

Взгляните также на эти методы:

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