Что такое NSObject
Что проверяют
Знаете ли вы, откуда в iOS берутся динамические возможности объектов и зачем в современном Swift-коде вообще появляется наследование от класса Objective-C. Вопрос базовый, но по ответу видно, приходилось ли вам работать с рантаймом или только собирать экраны из готовых компонентов.
Как отвечать
NSObject это корневой класс большей части иерархии Objective-C и одноимённый протокол, описывающий минимум, обязательный для любого объекта в Cocoa. От него наследнику достаются:
- жизненный цикл:
alloc,init,deallocи счётчик ссылок сretain,release,autorelease; - интроспекция рантайма:
isKindOfClass:,respondsToSelector:,conformsToProtocol:; - равенство и хеш:
isEqual:иhash, на которые опираются множества и словари; - пересылка сообщений через
forwardInvocation:, а также KVC и KVO.
В Swift общего предка у классов нет: обычный класс не наследуется ни от чего. NSObject пишут осознанно, когда нужен рантайм Objective-C: KVO, селекторы для #selector и связок цель-действие, соответствие протоколам UIKit, унаследованным от NSObjectProtocol, архивация через NSCoding. Плата за это динамическая диспетчеризация помеченных членов и отключённая часть оптимизаций компилятора.
Сильный ответ добавит, что вторым корневым классом остаётся NSProxy и что общий предок нужен рантайму, а не языку: в Swift ту же роль играют протоколы и обобщения.
Где спотыкаются
Утверждают, что от NSObject наследуется вообще всё, включая классы Swift. Это неверно и сразу показывает, что языки в голове слиплись: у Swift базового класса нет, наследование от NSObject там осознанное решение с понятной ценой.
Переопределяют == у наследника NSObject и забывают про пару isEqual: и hash. Сравнение таких объектов уходит в метод рантайма, поэтому объект теряется в Set и в словаре, хотя тесты на равенство зелёные.
Считают ARC свойством базового класса. Подсчёт ссылок действительно описан в NSObject, но расставляет вызовы компилятор по правилам именования, и к наследованию это отношения не имеет.