5

Patrząc na the Mac OS X 10.8's version of the Objective-C runtime library source code, zauważyłem, że ma plik NSObject.mm. Jak sama nazwa wskazuje, ma implementację klasy NSObject, a także wbudowaną pulę autorelease i implementacje count.Czy klasa NSObject jest dziś częścią biblioteki uruchomieniowej Objective-C (zamiast być komponentem Foundation)?

Jednakże wersje biblioteki wykonawczego objc przed jednym Mountain Lion za nie wdrożenie klasę NSObject (oni nie mieć plik NSObject.mm, jak widać na Mac OS X 10.7's Objective-C runtime library source code, na przykład).

Czy to naprawdę oznacza, że ​​klasa NSObject jest teraz częścią biblioteki wykonawczej Objective-C zamiast być komponentem biblioteki Foundation? Jeśli tak, dlaczego? Czy podczas podklasy NSObject należy unikać pojedynczego połączenia z całą biblioteką Foundation (z -framework Foundation)?

Odpowiedz

7

Można zobaczyć, co jest częścią żadnej konkretnej biblioteki używając nm (1) narzędzia.

Jeśli uruchomić to na libobjc, przekonasz się, że NSObject jest faktycznie dostarczone przez 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” oznacza, że ​​symbol jest świadczone przez biblioteki; „u” oznacza, że ​​symbol jest niezdefiniowany, co oznacza, że ​​biblioteka używa go, ale musi pochodzić z innego źródła.)

To nie pierwszy raz, kiedy przenieśli implementację NSObject; w Lion znajdziesz go w CoreFoundation.framework.

Nie mam pojęcia, dlaczego go przenieśli. W każdym razie jest to szczegół implementacji; oficjalnie, NSObject is still part of Foundation.

+2

Miejsce, w którym zaimplementowano NSObject, jest szczegółem implementacji. NSObject został przeniesiony w dół stosu wraz z libobjc, tak aby więcej systemu mogło wykorzystać Cel C. – bbum

+0

Nie sądzę, że 'NSObject' jest (oficjalnie lub w inny sposób) uważany za część Fundacji. [Dokumentacja Apple dla 'NSObject'] (https://developer.apple.com/documentation/objectivec/nsobject?language=objc) teraz wymienia ją jako pochodzącą ze struktury" Objective-C "i nie wspomina o strukturze Foundation . – Cornstalks

3

NSObject zawsze był i nadal jest klasą Fundacji. Dopiero w tej iteracji środowiska wykonawczego wdrożenie było otwarte (nie pytaj mnie, dlaczego wielki owoc działa w tajemniczy sposób). Twoje pierwotne założenie, że nie łączymy się z całością fundacji, jest wadliwe, biorąc pod uwagę, że NSObject jest głęboko zakorzeniony w aspekcie C Objective-C i bibliotece środowiska wykonawczego, które są niejawnie połączone, a Foundation zapewnia źródło wielu klas, które również oddziałują z stroną C rzeczy i środowiska wykonawczego. Pomyśl o fundacji jako pomostu między C i ObjC, zamiast o dodatkowe ramy, z którymi można się połączyć.

NSObject, jak powiedział Peter, nadal oficjalnie jest klasą podstawową, jednak został niedawno przeniesiony do biblioteki uruchomieniowej, aby umożliwić użytkownikom libDispatch/libXPC skupić się bardziej na stronie rzeczy ObjC (ponieważ używają oni ObjC typy w tych bibliotekach), zamiast konieczności instalowania Core Foundation za każdym razem, gdy musieli dodawać coś do swoich frameworków.

(przez @Catfish_Man)

Powiązane problemy