Objective-C: предпочтительный способ получить суперкласс экземпляра класса - PullRequest
13 голосов
/ 22 августа 2011

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

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

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

Ответы [ 3 ]

24 голосов
/ 22 августа 2011

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

Вы должны обычно использовать метод суперкласса NSObject вместо этого функция

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

4 голосов
/ 08 октября 2012

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

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

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

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

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

2 голосов
/ 22 августа 2011

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

...