Bawię się niektórymi z nowych funkcji iOS 7 i pracuję z niektórymi efektami obrazowymi, jak omówiono w filmie WWDC „Implementing Engaging UI na iOS”. Aby uzyskać efekt rozmycia w kodzie źródłowym sesji, UIImage
został rozszerzony o kategorię, która importuje UIKit w następujący sposób:
@import UIKit;
Chyba coś o tym widziałem w innym filmie z sesji, ale mam problem ze znalezieniem tego. Szukam jakichkolwiek dodatkowych informacji o tym, kiedy tego użyć. Czy można go używać tylko z platformami Apple? Czy korzyści płynące ze stosowania tej dyrektywy kompilatora są wystarczające, że powinienem wrócić i zaktualizować stary kod?
ios
objective-c
import
ios7
jamdaddy25
źródło
źródło
Odpowiedzi:
Jest to nowa funkcja o nazwie Moduły lub „import semantyczny”. Więcej informacji znajduje się w filmach WWDC 2013 dla sesji 205 i 404 . To rodzaj lepszej implementacji wstępnie skompilowanych nagłówków. Możesz używać modułów z dowolnymi strukturami systemowymi w iOS 7 i Mavericks. Moduły stanowią razem pakiet wykonywalny frameworka i jego nagłówków i są reklamowane jako bezpieczniejsze i bardziej wydajne niż
#import
.Jedną z dużych zalet używania
@import
jest to , że nie trzeba dodawać frameworka w ustawieniach projektu, odbywa się to automatycznie . Oznacza to, że możesz pominąć krok, w którym kliknąłeś przycisk plus i poszukać frameworka (złoty zestaw narzędzi), a następnie przenieść go do grupy „Frameworki”. Uratuje to wielu programistów przed tajemniczymi komunikatami „Błąd linkera”.W rzeczywistości nie musisz używać
@import
słowa kluczowego. Jeśli zdecydujesz się na korzystanie z modułów, wszystkie#import
i wszystkie#include
dyrektywy zostaną zmapowane do użycia@import
automatycznie. Oznacza to, że nie musisz zmieniać kodu źródłowego (lub kodu źródłowego bibliotek, które pobierasz z innego miejsca). Podobno użycie modułów poprawia również wydajność kompilacji, szczególnie jeśli nie korzystałeś dobrze z PCH lub jeśli twój projekt ma wiele małych plików źródłowych.Moduły są wstępnie zbudowane dla większości platform Apple (UIKit, MapKit, GameKit itp.). Możesz ich używać z tworzonymi przez siebie szkieletami: są tworzone automatycznie, jeśli utworzysz szkielet Swift w Xcode, i możesz ręcznie samodzielnie utworzyć plik „.modulemap” dla dowolnej biblioteki Apple lub innej firmy .
Możesz użyć uzupełniania kodu, aby zobaczyć listę dostępnych frameworków:
Moduły są domyślnie włączone w nowych projektach w Xcode 5 . Aby włączyć je w starszym projekcie, przejdź do ustawień kompilacji projektu, wyszukaj „Moduły” i ustaw „Włącz moduły” na „TAK”. „Struktury linków” powinny być również „TAK”:
Musisz używać Xcode 5 i iOS 7 lub Mavericks SDK, ale nadal możesz wypuszczać wersje dla starszych systemów operacyjnych (powiedzmy iOS 4.3 lub cokolwiek innego). Moduły nie zmieniają sposobu budowania kodu ani żadnego kodu źródłowego.
Ze slajdów WWDC:
Aby jawnie użyć modułów:
wymienić
#import <Cocoa/Cocoa.h>
z@import Cocoa;
Za pomocą tej notacji możesz również zaimportować tylko jeden nagłówek:
Podmoduły autouzupełniają się w Tobie w Xcode.
źródło
@import sqlite3
działało dla mnie, ponieważ stworzyłem dla niego własny moduł module.map i kiedy zdałem sobie sprawę, że sqlite został dołączony do systemu OS X i usunąłem moduł module.map, kompilator kontynuował używanie przestarzałego modułu.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:
Lub w przypadku ram:
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
iSomeFileB.h
;SomeFileA.h
obejmujeSomeFileB.h
iSomeFileB.h
obejmujeSomeFileA.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:
Aby zaimportować tę bibliotekę jako moduł, kod zostałby zmieniony na:
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ć:
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.źródło
Obecnie działa tylko dla wbudowanych platform systemowych. Jeśli używasz programu
#import
Apple, nadal importujeszUIKit
strukturę w aplikacji delegowanej, jest ona zastępowana (jeśli moduły są włączone i są rozpoznawane jako struktura systemowa), a kompilator przekształci go w import modułu, a nie import plików nagłówków . Więc pozostawienie#import
będzie tak samo jak jego konwersja do importu modułu, jeśli to możliweźródło
Wygląda na to, że od XCode 7.x pojawia się wiele ostrzeżeń przy włączaniu modułu clang z
CLANG_ENABLE_MODULES
Spójrz na wiele ostrzeżeń podczas budowania z Xcode 7 z bibliotekami stron trzecich
źródło
Korzystanie z modułów ma kilka zalet. Możesz go używać tylko w ramach Apple, chyba że tworzona jest mapa modułów.
@import
jest nieco podobny do prekompilowanych plików nagłówkowych po dodaniu do.pch
pliku, co jest sposobem na dostosowanie aplikacji do procesu kompilacji. Dodatkowo nie musisz dodawać bibliotek w stary sposób, korzystanie z nich@import
jest znacznie szybsze i wydajniejsze. Jeśli nadal szukasz miłej referencji, zdecydowanie polecam przeczytanie tego artykułu .źródło
Historia:
#include vs #import
.pch - Prekompilowany nagłówek
Moduł -
@import
@module
deklaracja mówi kompilatorowi, aby załadował wstępnie skompilowany plik binarny frameworka, który skraca czas budowania . Modular Framework zawiera.modulemap
[Informacje]Jeśli funkcja modułu jest włączona w projekcie Xcode,
#include
a#import
dyrektywy są automatycznie konwertowane na@import
to, ma to wszystkie zaletyźródło