Objective-C: Forward Class Declaration

Piszę aplikację multiview, która wykorzystuje klasę o nazwie RootViewController do przełączania między widokami.

W moim nagłówku MyAppDelegate, tworzę instancję RootViewController o nazwie rootViewController. Widziałem takie przykłady, gdzie dyrektywa @class jest używana jako" deklaracja klasy forward", ale nie jestem do końca pewien, co to oznacza lub czego dokonuje.

#import <UIKit/UIKit.h>
@class RootViewController;
@interface MyAppDelegate
.
.
.
Author: Brian Tompsett - 汤莱恩, 2011-03-04

2 answers

W zasadzie mówi kompilatorowi, że klasa RootViewController istnieje, bez określania, jak dokładnie wygląda (tj.: jej metody, właściwości, itp.). Możesz użyć tego do napisania kodu zawierającego zmienne członkowskie RootViewController bez konieczności dołączania pełnej deklaracji klasy.

Jest to szczególnie przydatne w rozwiązywaniu kolistych zależności - na przykład, gdzie powiedzmy ClassA ma element typu ClassB*, a ClassB ma element typu ClassA*. Musisz mieć ClassB zadeklarowane przed użyciem w ClassA, ale musisz również zadeklarować ClassA, zanim będziesz mógł go użyć w ClassB. Deklaracje Forward pozwalają na przezwyciężenie tego poprzez powiedzenie ClassA, że ClassB istnieje, bez konieczności faktycznego określania ClassB's pełnej specyfikacji.

Innym powodem, dla którego masz tendencję do znajdowania wielu deklaracji forward, jest to, że niektórzy ludzie przyjmują konwencję klas forward declaration, chyba że absolutnie muszą zawierać pełną deklarację. Nie do końca pamiętam, ale być może to coś, co Apple poleca w swoim Objective-C guidlines style guidlines.

Kontynuując mój powyższy przykład, jeśli Twoje deklaracje ClassA i ClassB znajdują się odpowiednio w plikach ClassA.h i ClassB.h, musisz #import któregokolwiek z nich użyć swojej deklaracji w drugiej klasie. Użycie deklaracji forward oznacza, że nie potrzebujesz #import, co sprawia, że kod jest ładniejszy (szczególnie gdy zaczniesz zbierać kilka klas, z których każda będzie potrzebować `#import gdzie jest używana), i zwiększa kompilację wydajność poprzez zminimalizowanie ilości kodu, który kompilator musi wziąć pod uwagę podczas kompilacji dowolnego pliku.

Na marginesie, chociaż pytanie dotyczy wyłącznie deklaracji forward w Objective-C, wszystkie uwagi dotyczące postępowania odnoszą się również w równym stopniu do kodowania w C i C++ (i prawdopodobnie wielu innych językach), które również wspierają deklaracje forward I zazwyczaj wykorzystują je do tych samych celów.

 99
Author: Mac,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-25 09:36:52

Deklaracje terminowe mają na celu przede wszystkim uniknięcie importu kołowego, gdzie jeden plik importuje inny plik, który importuje pierwszy plik itp. Zasadniczo podczas importowania pliku zawartość pliku jest zastępowana w punkcie importu podczas budowania projektu, który jest następnie przekazywany do kompilatora. Jeśli masz okrągły import, masz nieskończoną pętlę, która nigdy się nie skompiluje. Na szczęście xcode powie Ci o tym przed próbą. Deklaracja forward mówi "nie Importuj tej klasy, ale wiedz, że istnieje. "Bez deklaracji import lub forward pojawia się błąd, że taka klasa nie istnieje.

 1
Author: Aks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-05 18:16:05