Fajna odpowiedź na to pytanie znajduje się w książce Learning Cocoa with Objective-C (ISBN: 978-1-491-90139-7)
Moduły to nowy sposób włączania i łączenia plików i bibliotek z projektami. Aby zrozumieć, w jaki sposób działają moduły i jakie mają one zalety, ważne jest, aby spojrzeć wstecz na historię Objective-C i instrukcję #import Za każdym razem, gdy chcesz dołączyć plik do użytku, zazwyczaj masz jakiś kod, który wygląda następująco:
#import "someFile.h"
Lub w przypadku ram:
#import <SomeLibrary/SomeFile.h>
Ponieważ Objective-C jest nadzbiorem języka programowania C, stwierdzenie #import stanowi niewielkie udoskonalenie #include
instrukcji C. Instrukcja #include jest bardzo prosta; kopiuje wszystko, co znajdzie w dołączonym pliku do twojego kodu podczas kompilacji. Może to czasem powodować poważne problemy. Na przykład wyobraź sobie, że masz dwa pliki nagłówkowe: SomeFileA.h
i SomeFileB.h
; SomeFileA.h
obejmuje SomeFileB.h
i SomeFileB.h
obejmuje SomeFileA.h
. To tworzy pętlę i może dezorientować współimpiler. Aby sobie z tym poradzić, programiści C muszą napisać zabezpieczenia przed wystąpieniem tego typu zdarzenia.
Podczas używania #import
nie musisz martwić się tym problemem ani pisać osłon nagłówków, aby go uniknąć. Jednak #import
nadal jest to tylko chwalebna operacja kopiowania i wklejania, powodująca wolny czas kompilacji wśród wielu innych mniejszych, ale wciąż bardzo niebezpiecznych problemów (takich jak dołączony plik przesłaniający coś, co zadeklarowałeś gdzie indziej w twoim własnym kodzie).
Moduły są próbą obejścia tego. Nie są już kopiowaniem i wklejaniem do kodu źródłowego, ale serializacją przedstawionych plików, które można zaimportować do kodu źródłowego tylko wtedy, gdy są potrzebne. Używając modułów, kod na ogół kompiluje się szybciej i jest bezpieczniejszy niż przy użyciu #include lub #import
.
Wracając do poprzedniego przykładu importowania frameworka:
#import <SomeLibrary/SomeFile.h>
Aby zaimportować tę bibliotekę jako moduł, kod zostałby zmieniony na:
@import SomeLibrary;
Ma to dodatkową zaletę Xcode automatycznie łączącą strukturę SomeLibrary z projektem. Moduły pozwalają również uwzględniać tylko te elementy, których naprawdę potrzebujesz w swoim projekcie. Na przykład, jeśli chcesz użyć komponentu AwesomeObject w ramach AwesomeLibrary, zwykle musisz zaimportować wszystko, aby użyć tylko jednego elementu. Jednak za pomocą modułów możesz po prostu zaimportować określony obiekt, którego chcesz użyć:
@import AwesomeLibrary.AwesomeObject;
We wszystkich nowych projektach wykonanych w Xcode 5 moduły są domyślnie włączone. Jeśli chcesz używać modułów w starszych projektach (a naprawdę powinieneś), należy je włączyć w ustawieniach kompilacji projektu. Gdy to zrobisz, możesz używać zarówno #import
i @import
oświadczeń w kodzie razem bez żadnych obaw.