@import vs #import – iOS 7

Ik speel wat met enkele van de nieuwe iOS 7-functies en werk met enkele van de beeldeffecten zoals besproken in de WWDC-video “Implementing Engaging UI on iOS”. Voor het produceren van een vervagingseffect binnen de broncode voor de sessie, werd UIImageuitgebreid met een categorie die UIKit als volgt importeert:

@import UIKit;

Ik denk dat ik hier iets over heb gezien in een andere sessievideo, maar ik kan het niet vinden. Ik ben op zoek naar achtergrondinformatie over wanneer ik dit moet gebruiken. Kan het alleen worden gebruikt met Apple-frameworks? Zijn de voordelen van het gebruik van deze compilerrichtlijn voldoende om terug te gaan en de oude code bij te werken?


Antwoord 1, autoriteit 100%

Het is een nieuwe functie genaamd Modulesof “semantische import”. Er is meer informatie in de WWDC 2013-video’s voor Session 205en 404. Het is een soort betere implementatie van de vooraf gecompileerde headers. Je kunt modules gebruiken met elk van de systeemframeworks in iOS 7 en Mavericks.Modules zijn een samenvoeging van het uitvoerbare framework en de headers ervan en worden aangeprezen als veiliger en efficiënter dan #import.

Een van de grote voordelen van het gebruik van @importis dat je het raamwerk niet hoeft toe te voegen in de projectinstellingen, het wordt automatisch gedaan. Dat betekent dat u de stap kunt overslaan waar u op de plusknop klikt en naar het raamwerk (gouden toolbox) zoekt, en het vervolgens naar de groep “Frameworks” kunt verplaatsen. Het zal veel ontwikkelaars redden van de cryptische “Linker error”-berichten.

U hoeft het trefwoord @importeigenlijk niet te gebruiken.Als u zich aanmeldt voor het gebruik van modules, worden alle #importen #include-richtlijnen worden toegewezen om automatisch @importte gebruiken. Dat betekent dat u uw broncode (of de broncode van bibliotheken die u elders downloadt) niet hoeft te wijzigen. Vermoedelijk verbetert het gebruik van modules ook de bouwprestaties, vooral als je PCH’s niet goed hebt gebruikt of als je project veel kleine bronbestanden heeft.

Modules zijn vooraf gebouwd voor de meeste Apple-frameworks (UIKit, MapKit, GameKit, enz.). Je kunt ze gebruiken met frameworks die je zelf maakt: ze worden automatisch gemaakt als je een Swift-framework maakt in Xcode, en je kunt zelf handmatig een “.modulemap”-bestand maken voor elke bibliotheek van Apple of derden.

U kunt code-aanvulling gebruiken om de lijst met beschikbare frameworks te zien:

voer hier de afbeeldingsbeschrijving in

Modules zijn standaard ingeschakeld in nieuwe projecten in Xcode 5. Om ze in een ouder project in te schakelen, gaat u naar de instellingen voor het bouwen van uw project, zoekt u naar “Modules” en stelt u “Modules inschakelen” in op “JA”. De “Link Frameworks” moeten ook “JA” zijn:

Je moet Xcode 5 en de iOS 7 of Mavericks SDK gebruiken, maar je kunt nog steeds vrijgeven voor oudere besturingssystemen (bijvoorbeeld iOS 4.3 of wat dan ook). Modules veranderen niet hoe uw code is gebouwd of de broncode.


Van de WWDC-dia’s:

  • Importeert een volledige semantische beschrijving van een raamwerk
  • Hoeft de headers niet te ontleden
  • Betere manier om de interface van een framework te importeren
  • Laadt binaire weergave
  • Flexibeler dan voorgecompileerde headers
  • Immune voor effecten van lokale macrodefinities (bijv. #define readonly 0x01)
  • Standaard ingeschakeld voor nieuwe projecten

Om expliciet modules te gebruiken:

Vervang #import <Cocoa/Cocoa.h>door @import Cocoa;

U kunt ook slechts één koptekst importeren met deze notatie:

@import iAd.ADBannerView;

De submodules worden automatisch voor u aangevuld in Xcode.


Antwoord 2, autoriteit 6%

Mooi antwoord vind je in boek Learning Cocoa with Objective-C (ISBN: 978-1-491-90139-7)

Modules zijn een nieuwe manier om bestanden en bibliotheken op te nemen en te koppelen aan uw projecten. Om te begrijpen hoe modules werken en welke voordelen ze hebben, is het belangrijk om terug te kijken in de geschiedenis van Objective-C en het #importstatement
Wanneer je een bestand wilt toevoegen voor gebruik, heb je over het algemeen een code die er als volgt uitziet:

#import "someFile.h"

Of in het geval van frameworks:

#import <SomeLibrary/SomeFile.h>

Omdat Objective-C een superset is van de programmeertaal C, is de #import-instructie een kleine verfijning op de #include-instructie van C. Het #include-statement is heel eenvoudig; het kopieert alles wat het in het bijgevoegde bestand vindt tijdens het compileren naar uw code. Dit kan soms grote problemen veroorzaken. Stel je bijvoorbeeld voor dat je twee header-bestanden hebt: SomeFileA.hen SomeFileB.h; SomeFileA.hbevat SomeFileB.hen SomeFileB.hbevat SomeFileA.h. Dit creëert een lus en kan de co-impiler in de war brengen. Om hiermee om te gaan, moeten C-programmeurs beveiligingen schrijven om dit soort gebeurtenissen te voorkomen.

Als u #importgebruikt, hoeft u zich geen zorgen te maken over dit probleem of header-guards te schrijven om dit te voorkomen. #importis echter nog steeds slechts een verheerlijkte kopieer-en-plakactie, die een trage compilatietijd veroorzaakt tussen een groot aantal andere kleinere maar nog steeds zeer gevaarlijke problemen (zoals een opgenomen bestand dat iets overschrijft dat u elders hebt aangegeven in uw eigen code.)

Modules zijn een poging om dit te omzeilen. Ze zijn niet langer kopiëren en plakken in de broncode, maar een geserialiseerde weergave van de meegeleverde bestanden die alleen in uw broncode kunnen worden geïmporteerd wanneer en waar ze nodig zijn. Door modules te gebruiken, wordt code over het algemeen sneller gecompileerd en veiliger dan het gebruik van #include of #import.

Terugkerend naar het vorige voorbeeld van het importeren van een raamwerk:

#import <SomeLibrary/SomeFile.h>

Om deze bibliotheek als module te importeren, wordt de code gewijzigd in:

@import SomeLibrary;

Dit heeft de toegevoegde bonus dat Xcode het SomeLibrary-framework automatisch aan het project koppelt. Met modules kunt u ook alleen de componenten opnemen die u echt nodig heeft in uw project. Als u bijvoorbeeld de component AwesomeObject in het AwesomeLibrary-framework wilt gebruiken, zou u normaal gesproken alles moeten importeren om dat ene stuk te gebruiken. Als u echter modules gebruikt, kunt u het specifieke object dat u wilt gebruiken gewoon importeren:

@import AwesomeLibrary.AwesomeObject;

Voor alle nieuwe projecten die in Xcode 5 zijn gemaakt, zijn modules standaard ingeschakeld. Als je modules in oudere projecten wilt gebruiken (en dat zou je echt moeten doen), moeten ze worden ingeschakeld in de build-instellingen van het project. Als je dat eenmaal hebt gedaan, kun je zonder zorgen de instructies #importen @importsamen in je code gebruiken.


Antwoord 3

Het werkt momenteel alleen voor de ingebouwde systeemframeworks. Als je #importgebruikt zoals Apple nog steeds het UIKit-framework importeert in de app-gemachtigde, wordt het vervangen (als modules aan staan ​​en het wordt herkend als een systeemframework) en de compiler zal het hoe dan ook opnieuw toewijzen als een module-import en niet als een import van de header-bestanden.
Dus het verlaten van de #importzal hetzelfde zijn als het converteren naar een module-import waar mogelijk toch


4

Het gebruik van modules heeft een aantal voordelen. Je kunt het alleen gebruiken met Apple’s framework, tenzij er een modulekaart is gemaakt. @importlijkt een beetje op het pre-compileren van header-bestanden wanneer toegevoegd aan het .pch-bestand, wat een manier is om het compilatieproces van de app af te stemmen. Bovendien hoef je geen bibliotheken op de oude manier toe te voegen, het gebruik van @importis in feite veel sneller en efficiënter. Als je nog steeds op zoek bent naar een mooie referentie, raad ik je ten zeerste aan om dit artikel.

Other episodes