Почему [super class] и [self class] дают одинаковый результат?

-(NSString *) nibName
{
    PO([self class]);
    PO([super class]);
    PO([self superclass]);

Только [self superclass] создает фактический суперкласс.

[self class]: BGImageForBizs
[super class]: BGImageForBizs
[self superclass]: BGUIImageWithActivityIndicator

Ответ 1

Отправка сообщения с помощью super совпадает с отправкой его на self, но явно использует реализацию метода суперкласса. Но ваш класс, вероятно, не реализует сам метод -class, поэтому вы уже наследуете реализацию -class из своего суперкласса.

Фактически, вы, вероятно, наследуете NSObject реализацию -class (даже если NSObject не является вашим непосредственным суперклассом; -class - это не метод, который часто перераспределяется). И реализация по умолчанию просто возвращает содержимое указателя объекта isa, сообщая вам, что это за Class.

Другими словами, важно признать, что вызов super не полностью преобразует ваш объект в экземпляр его суперкласса; он просто запускает код суперкласса для этого метода. Если в этом коде есть какая-либо интроспекция, он все равно видит ваш объект как экземпляр любого класса, в котором он начинался.

Ответ 2

self и super - это один и тот же объект. Единственное, что делает супер, это контроль, который вызывается реализацией метода. Поскольку и ваш класс, и суперкласс используют NSObject-реализацию класса, тот же метод вызывается в обоих случаях.