@ import vs # import-iOS 7

Bawię się nowymi funkcjami iOS 7 i pracuję z niektórymi efektami obrazu, jak omówiono w filmie WWDC "Implementing Engaging UI on 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;

Wydaje mi się, że widziałem coś o tym na innym filmiku z sesji, ale mam problem ze znalezieniem tego. Szukam informacji kiedy tego użyć. Can it only be używane z frameworkami Apple? Czy korzyści płynące z używania tej dyrektywy kompilatora są wystarczające, że powinienem wrócić i zaktualizować stary kod?

Author: Cœur, 2013-09-22

5 answers

Jest to nowa funkcja o nazwie Modules lub "semantic import". Więcej informacji w WWDC 2013 filmy do sesji 205 oraz 404. To rodzaj lepszej implementacji wstępnie skompilowanych nagłówków. możesz używać modułów z dowolną strukturą systemu w iOS 7 i Mavericks. moduły są opakowaniem pliku wykonywalnego framework i jego nagłówków i są reklamowane jako bezpieczniejsze i bardziej wydajne niż #import.

Jeden z dużą zaletą korzystania z @import jest to, że nie trzeba dodawać frameworka w ustawieniach projektu, robi się to automatycznie . Oznacza to, że możesz pominąć krok, w którym klikniesz przycisk plus i wyszukać framework( złoty przybornik), a następnie przenieść go do grupy" Framework". Uratuje to wielu programistów przed tajemniczymi komunikatami "błąd łącznika".

Nie musisz używać słowa kluczowego @import. jeśli zdecydujesz się na korzystanie z modułów, wszystkie #import i #include dyrektywy są mapowane do użycia @import automatycznie. Oznacza to, że nie musisz zmieniać kodu źródłowego (lub kodu źródłowego bibliotek pobieranych z innego miejsca). Podobno używanie modułów również poprawia wydajność kompilacji, szczególnie jeśli nie używasz dobrze PCHs 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 frameworków Apple (UIKit, MapKit, GameKit itp.). Możesz ich używać z frameworkami, które sam tworzysz: są tworzone automatycznie, jeśli utworzysz framework Swift w Xcode i możesz ręcznie utworzyć ".modulemap " plik dla dowolnej biblioteki Apple lub innej firmy.

Możesz użyć uzupełniania kodu, aby zobaczyć listę dostępnych frameworków:

Tutaj wpisz opis obrazka

Moduły są domyślnie włączone w nowych projektach w Xcode 5. Aby włączyć je w starszym projekcie, przejdź do ustawień budowania projektu, wyszukaj "moduły" i Ustaw " Włącz Moduły "na"tak". "Ramy Linkowe" powinno być też "tak": {]}

Musisz używać Xcode 5 i iOS 7 lub Mavericks SDK, ale nadal możesz wydać dla starszych systemów operacyjnych (powiedzmy iOS 4.3 lub cokolwiek innego). Moduły nie zmieniają sposobu budowy Twojego kodu ani żadnego kodu źródłowego.


Ze slajdów WWDC:

  • importuje pełny semantyczny opis frameworka
  • nie trzeba analizować nagłówków
  • lepszy sposób na import frameworka interfejs
  • ładuje reprezentację binarną
  • bardziej elastyczne niż wstępnie skompilowane nagłówki
  • )
  • domyślnie włączone dla nowych projektów

Aby jawnie używać modułów:

Zastąp #import <Cocoa/Cocoa.h> na @import Cocoa;

Możesz również zaimportować tylko jeden nagłówek z tą notacją:

@import iAd.ADBannerView;

Podmoduły autocomplete dla Ciebie w Xcode.

 812
Author: nevan king,
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
2017-03-29 10:24:49

Fajną odpowiedź znajdziesz w książce Nauka kakao z Objective-C (ISBN: 978-1-491-90139-7)

Moduły to nowy sposób włączania i łączenia plików i bibliotek do Twoich projektów. Aby zrozumieć, jak działają moduły i jakie korzyści z nich płyną, ważne jest, aby spojrzeć wstecz do historii Objective-C i deklaracji # import Za każdym razem, gdy chcesz dołączyć plik do użycia, zazwyczaj masz kod, który wygląda tak:

#import "someFile.h"

Lub w przypadku Framework:

#import <SomeLibrary/SomeFile.h>

Ponieważ Objective - C jest supersetem języka programowania C, # Import state-ment jest drobnym udoskonaleniem instrukcji C #include. Instrukcja # include jest bardzo prosta; kopiuje wszystko, co znajduje się w dołączonym pliku do kodu podczas kompilacji. Czasami może to 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. Tworzy pętlę i może mylić coimpiler. Aby sobie z tym poradzić, Programiści C muszą pisać zabezpieczenia przed tego typu zdarzeniami.

Podczas używania #import, nie musisz się martwić o ten problem ani pisać osłon nagłówka, aby go uniknąć. Jednak {[12] } jest nadal tylko gloryfikowaną akcją kopiowania i wklejania, powodując powolny czas kompilacji wśród wielu innych mniejszych, ale nadal bardzo niebezpiecznych problemów (takich jak dołączony plik nadpisujący coś, co zadeklarowałeś w innym miejscu w swoim kodzie.)

Moduły są spróbuj to obejść. Nie są one już kopiowaniem i wklejaniem do kodu źródłowego, ale serializowaną reprezentacją dołączonych plików, które można zaimportować do kodu źródłowego tylko wtedy, gdy są potrzebne i gdzie są potrzebne. Używając modułów, kod będzie kompilowany szybciej i będzie bezpieczniejszy niż użycie #include lub #import.

Powrót do poprzedniego przykładu importowania frameworka:

#import <SomeLibrary/SomeFile.h>

Aby zaimportować tę bibliotekę jako moduł, kod zostanie zmieniony do:

@import SomeLibrary;

To ma dodatkowy bonus Xcode łączący SomeLibrary framework z projektem automatycznie. Moduły pozwalają również na włączenie do projektu tylko tych komponentów, których naprawdę potrzebujesz. Na przykład, jeśli chcesz użyć komponentu AwesomeObject w ramach AwesomeLibrary, normalnie musisz zaimportować wszystko, aby użyć one piece. Jednak, używając modułów, możesz po prostu zaimportować konkretny obiekt, którego chcesz użyć:

@import AwesomeLibrary.AwesomeObject;

Dla wszystkich nowych projekty wykonane w Xcode 5, moduły są domyślnie włączone. Jeśli chcesz używać modułów w starszych projektach (i naprawdę powinieneś), będą one musiały być włączone w Ustawieniach budowania projektu. Gdy to zrobisz, możesz używać zarówno #import jak i @import w swoim kodzie razem bez obaw.

 41
Author: gbk,
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
2014-07-27 19:26:48

Obecnie działa tylko dla Wbudowanych frameworków systemowych. Jeśli używasz #import jak apple nadal importować UIKit framework w App delegate to jest zastępowany (jeśli moduły są włączone i są rozpoznawane jako Framework systemowy) i kompilator będzie ponownie go do importu modułu, a nie import plików nagłówkowych i tak. Tak więc pozostawienie #import będzie takie samo jak jego przekonwertowane do importu modułu, gdzie jest to możliwe w każdym razie

 2
Author: RyanTCB,
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
2014-09-07 08:44:41

Wydaje się, ż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

 2
Author: loretoparisi,
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-10-13 15:13:08

Jest kilka korzyści z używania modułów. Możesz go używać tylko z frameworkiem Apple, chyba że zostanie utworzona mapa modułów. @import jest nieco podobny do wstępnie kompilacji plików nagłówków po dodaniu do pliku .pch, który jest sposobem dostroić aplikację proces kompilacji. Dodatkowo nie musisz dodawać bibliotek w stary sposób, używanie @import jest znacznie szybsze i wydajniejsze. Jeśli nadal szukasz miłej referencji, Gorąco polecam przeczytanie tego artykułu .

 1
Author: Julian Król,
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
2014-02-18 22:41:20