Является ли класс NSObject сегодня частью библиотеки времени выполнения Objective-C (вместо того, чтобы быть компонентом Foundation)?

Глядя на версию исходного кода библиотеки времени выполнения Objective-C для Mac OS X 10.8 code, я заметил, что у него есть NSObject.mm файл. Как следует из названия, у него есть реализация класса NSObject, а также встроенный пул автоматического выпуска и реализации сохранения счетчика.

Однако версии библиотеки времени выполнения ObjC до версии Mountain Lion не реализовывали класс NSObject (у них не было файла NSObject.mm, как вы можете видеть на исходный код библиотеки времени выполнения Objective-C для Mac OS X 10.7, например).

Значит ли это, что класс NSObject теперь является частью библиотеки времени выполнения Objective-C, а не компонентом библиотеки Foundation? Если да, то почему? Чтобы избежать одной ссылки на всю библиотеку Foundation (с -framework Foundation) при создании подкласса NSObject?


person LuisABOL    schedule 17.03.2013    source источник


Ответы (2)


Вы можете увидеть, что является частью любой конкретной библиотеки, используя инструмент nm(1).

Если вы запустите это на libobjc, вы обнаружите, что NSObject фактически предоставляется libobjc:

% nm /usr/lib/libobjc.dylib | grep -F NSObject
⋮
0000000000021688 t +[NSObject _isDeallocating]
0000000000021674 t +[NSObject _tryRetain]
0000000000021780 t +[NSObject allocWithZone:]
000000000002176e t +[NSObject alloc]
0000000000021699 t +[NSObject allowsWeakReference]
0000000000021712 t +[NSObject autorelease]
0000000000020fa6 t +[NSObject class]
000000000002115a t +[NSObject conformsToProtocol:]
00000000000217ea t +[NSObject copyWithZone:]
00000000000217e6 t +[NSObject copy]
000000000002178d t +[NSObject dealloc]
⋮

(«t» означает, что символ предоставляется этой библиотекой; «u» означает, что символ не определен, то есть эта библиотека использует его, но он должен быть получен откуда-то еще.)

Это не первый раз, когда они перемещают реализацию NSObject; в Lion вы найдете его в CoreFoundation.framework.

Я понятия не имею, почему они передвинули его. Во всяком случае, это деталь реализации; официально, NSObject по-прежнему часть Фонда.

person Peter Hosey    schedule 17.03.2013
comment
Где реализован NSObject — это деталь реализации. NSObject был перемещен вниз по стеку вместе с libobjc, чтобы большая часть системы могла использовать Objective C. - person bbum; 22.03.2013
comment
Я не думаю, что NSObject (официально или иным образом) больше не считается частью Фонда. в документации Apple для NSObject теперь указано, что это исходит из Objective-C framework и не упоминает фреймворк Foundation. - person Cornstalks; 04.03.2018

NSObject всегда был и остается классом Foundation. Только в этой итерации среды выполнения реализация для него была открыта (не спрашивайте меня почему, большой плод работает загадочным образом). Ваше первоначальное предположение о том, что вы не связываетесь со всей основой, ошибочно, учитывая, что NSObject глубоко укоренен в C-аспекте Objective-C и библиотеке времени выполнения, которые связаны неявно, а Foundation обеспечивает корень многих классов, которые также взаимодействуют с C-стороной вещей и средой выполнения. Думайте о Foundation как о мосте между C и ObjC, а не о дополнительной структуре, с которой можно связать.

NSObject, как сказал Питер, по-прежнему официально является базовым классом, однако недавно он был перемещен в библиотеку времени выполнения, чтобы ребята из libDispatch/libXPC могли больше сосредоточиться на стороне вещей ObjC (потому что они используют типы ObjC в этих библиотеках). , вместо того, чтобы исправлять Core Foundation каждый раз, когда им нужно что-то добавить в свои соответствующие фреймворки.

(через @Catfish_Man)

person CodaFi    schedule 17.03.2013