Objective-C: предпочтительный способ получения суперкласса экземпляра класса

Мне интересно, какой из двух следующих методов является правильным или предпочтительным для получения суперкласса переменной Class:

  1. Class getSuperclass(Class cls) { return [cls superclass]; }

  2. Class getSuperclass(Class cls) { return class_getSuperclass(cls); }


person MKroehnert    schedule 21.08.2011    source источник


Ответы (3)


Ну, документы на class_getSuperclass() говорят следующее:

Обычно вместо этой функции следует использовать метод суперкласса NSObject.

Итак, я бы пошел с дверью № 1.

person Ben Zotto    schedule 21.08.2011
comment
Потому что использование этой функции должно сначала #импортировать ‹objc/runtime.h›. Шучу... - person Veight Zhou; 13.10.2015

Принятый ответ технически правильный (да, так говорят документы), и все же это неправильный ответ.

[* superclass] только существует для объектов, являющихся подклассами NSObject.

Да, это большинство классов, которые вы используете изо дня в день.

Однако... есть много классов, которые вы можете встретить, которые не являются подклассами NSObject.

Простой пример: если вы перебираете "все загруженные классы" (например, с помощью objc_getClassList), то многие из возвращенных классов приведут к краху вашего приложения, если вы используете метод [суперкласс класса].

person Adam    schedule 08.10.2012
comment
Спасибо за ценное дополнение. В моем случае это сработало, как и ожидалось, поскольку я использовал его только для определенных классов, которые были производными от NSObject. - person MKroehnert; 13.10.2012

Я уверен, что они абсолютно идентичны, а это означает, что superclass NSObject реализуется через class_getSuperclass. Я не уверен, но я бы поставил пиво на это.

person Andrea Bergia    schedule 21.08.2011
comment
Я бы не стал ставить против вас, хотя я думаю, что разумное руководство по стилю для Obj-C не вызывает интерфейс C среды выполнения, если есть эквивалентное объектное сообщение. - person Ben Zotto; 22.08.2011
comment
Согласен, и я бы тоже выбрал NSObject superclass. Но я думаю, что они оба верны, как и просил ОП. - person Andrea Bergia; 22.08.2011
comment
Спасибо за ваш комментарий Андреа. Я проверил другой ответ, потому что он также содержит ссылку на документацию, где они предлагают позвонить [NSObject superclass]. - person MKroehnert; 22.08.2011