@import बनाम #import - iOS 7


432

मैं कुछ नए iOS 7 फीचर्स के साथ खेल रहा हूं और WWDC वीडियो "इंप्लॉइजिंग यूआई ऑन आईओएस" पर चर्चा करते हुए कुछ इमेज इफेक्ट्स के साथ काम कर रहा हूं। सत्र के लिए स्रोत कोड के भीतर एक धब्बा प्रभाव पैदा करने के लिए, UIImageएक श्रेणी के माध्यम से बढ़ाया गया था जो कि UIKit को आयात करता है:

@import UIKit;

मुझे लगता है कि मैंने दूसरे सत्र के वीडियो में इसके बारे में कुछ देखा है लेकिन मुझे इसे ढूंढने में परेशानी हो रही है। मैं किसी भी पृष्ठभूमि जानकारी के लिए देख रहा हूँ जब यह उपयोग करने के लिए। क्या इसका उपयोग केवल ऐप्पल फ्रेमवर्क के साथ किया जा सकता है? क्या इस संकलक निर्देश का उपयोग करने के लाभ पर्याप्त हैं कि मुझे वापस जाना चाहिए और पुराने कोड को अपडेट करना चाहिए?


जवाबों:


838

यह एक नया फीचर है जिसे मॉड्यूल या "सिमेंटिक इम्पोर्ट" कहा जाता है । WWDC 2013 के वीडियो में सत्र 205 और 404 के लिए अधिक जानकारी है । यह पूर्व संकलित हेडर के बेहतर कार्यान्वयन की तरह है। आप iOS 7 और Mavericks में किसी भी सिस्टम फ्रेमवर्क के साथ मॉड्यूल का उपयोग कर सकते हैं। मॉड्यूल निष्पादन योग्य फ्रेमवर्क के साथ एक पैकेजिंग हैं और यह हेडर हैं और सुरक्षित और अधिक कुशल होने के कारण टाउटेड हैं #import

उपयोग करने के बड़े लाभों में से @importएक यह है कि आपको परियोजना सेटिंग्स में रूपरेखा जोड़ने की आवश्यकता नहीं है, यह स्वचालित रूप से किया जाता है । इसका मतलब है कि आप उस चरण को छोड़ सकते हैं जहां आप प्लस बटन पर क्लिक करते हैं और फ्रेमवर्क (गोल्डन टूलबॉक्स) की खोज करते हैं, फिर इसे "फ्रेमवर्क" समूह में ले जाएं। यह कई डेवलपर्स को क्रिप्टिक "लिंकर त्रुटि" संदेशों से बचाएगा।

आपको वास्तव में @importकीवर्ड का उपयोग करने की आवश्यकता नहीं है । यदि आप मॉड्यूल का उपयोग करने का विकल्प चुनते हैं, तो सभी #importऔर #includeनिर्देशों का @importस्वचालित रूप से उपयोग करने के लिए मैप किया जाता है। इसका मतलब है कि आपको अपना स्रोत कोड (या पुस्तकालयों का स्रोत कोड जो आपको कहीं और से डाउनलोड करना है) को बदलना नहीं है। माना जाता है कि मॉड्यूल का उपयोग बिल्ड प्रदर्शन को भी बेहतर बनाता है, खासकर यदि आप पीसीएच का अच्छी तरह से उपयोग नहीं कर रहे हैं या यदि आपकी परियोजना में कई छोटे स्रोत फाइलें हैं।

मॉड्यूल अधिकांश Apple फ्रेमवर्क (UIKit, MapKit, GameKit, आदि) के लिए पूर्व-निर्मित हैं। आप उन्हें अपने द्वारा बनाए गए चौखटे के साथ उपयोग कर सकते हैं: यदि आप Xcode में एक स्विफ्ट फ्रेमवर्क बनाते हैं तो वे अपने आप बन जाते हैं, और आप स्वयं किसी भी Apple या 3rd-party लाइब्रेरी के लिए ".modulemap" फ़ाइल स्वयं बना सकते हैं ।

आप उपलब्ध रूपरेखाओं की सूची देखने के लिए कोड-पूर्ति का उपयोग कर सकते हैं:

यहां छवि विवरण दर्ज करें

Xcode 5 में नई परियोजनाओं में डिफ़ॉल्ट रूप से मॉड्यूल सक्षम हैं । किसी पुराने प्रोजेक्ट में उन्हें सक्षम करने के लिए, अपने प्रोजेक्ट बिल्ड सेटिंग्स में जाएं, "मॉड्यूल" खोजें और "इनेबल मॉड्यूल" को "एईएस" पर सेट करें। "लिंक फ्रेमवर्क" "YES" भी होना चाहिए:

आपको Xcode 5 और iOS 7 या Mavericks SDK का उपयोग करना होगा, लेकिन आप अभी भी पुराने OS (जैसे iOS 4.3 या जो भी हो) के लिए जारी कर सकते हैं। मॉड्यूल यह नहीं बदलते कि आपका कोड कैसे बनाया गया है या स्रोत कोड में से कोई भी है।


WWDC स्लाइड्स से:

  • आयात एक ढांचे का पूरा अर्थपूर्ण विवरण
  • हेडर को पार्स करने की आवश्यकता नहीं है
  • फ्रेमवर्क के इंटरफ़ेस को आयात करने का बेहतर तरीका
  • भार बाइनरी प्रतिनिधित्व
  • पूर्वनिर्मित हेडर की तुलना में अधिक लचीला
  • स्थानीय मैक्रो परिभाषाओं के प्रभाव के लिए इम्यून (जैसे #define readonly 0x01)
  • डिफ़ॉल्ट रूप से नई परियोजनाओं के लिए सक्षम

मॉड्यूल का स्पष्ट रूप से उपयोग करने के लिए:

बदलें #import <Cocoa/Cocoa.h>के साथ@import Cocoa;

आप इस नोटेशन के साथ सिर्फ एक हेडर आयात कर सकते हैं:

@import iAd.ADBannerView;

सबमॉडल्स आपके लिए Xcode में स्वत: पूर्ण हैं।


15
@DaveDeLong & Klaas: धन्यवाद! मुझे यह स्वीकार करना होगा कि जब मैंने पहली बार इसका उत्तर दिया था तो मुझे मॉड्यूल के बारे में कुछ नहीं पता था। मैंने जाकर सत्र 404 को देखा और इसे सीखा। डौग ग्रेगोर (LLVM आदमी) ने जो प्रस्तुति दी वह वास्तव में अच्छी तरह से किया गया था। वहाँ भी एक C ++ मॉड्यूल बात है, जहाँ लाभ यहाँ बताते हैं: youtube.com/watch?v=4Xo9iH5VLQ0
nevan राजा

3
@ nevan-- उत्तर के लिए धन्यवाद। मैं सिर्फ उस मॉड्यूल को जोड़ना चाहता था जो वर्तमान में तीसरे पक्ष और आपके स्वयं के ढांचे का समर्थन नहीं करता है।
जामदादी

क्या आप इसे अपनी कक्षाओं के लिए उपयोग कर सकते हैं?
सीफिशर

5
मुझे लगता है कि अगर आपको एक उपयुक्त मॉड्यूल.मैप प्रदान किया गया है, तो आप @ 3rdport पार्टी फ्रेमवर्क में सक्षम होना चाहिए। LLVM क्लैंग
bames53

1
ओह, वास्तव में ऐसा लग रहा है कि यह @import sqlite3मेरे लिए काम कर रहा है क्योंकि मैंने इसके लिए अपना खुद का मॉड्यूल.मैप बनाया था और जब मुझे एहसास हुआ कि स्काईलाइट को ओएस एक्स में शामिल किया गया है और मेरे मॉड्यूल को हटा दिया गया है। कंपाइलर ने बासी मॉड्यूल का उपयोग करना जारी रखा।
bames53

46

अच्छा जवाब आप ऑब्जेक्टिव-सी (आईएसबीएन: 978-1-491-90139-7) के साथ बुक लर्निंग कोकोआ में पा सकते हैं।

मॉड्यूल आपकी परियोजनाओं में फ़ाइलों और पुस्तकालयों को शामिल करने और जोड़ने का एक नया साधन हैं। यह समझने के लिए कि मॉड्यूल कैसे काम करते हैं और उनके क्या लाभ हैं, उद्देश्य-सी के इतिहास में वापस देखना महत्वपूर्ण है और #import स्टेटमेंट जब भी आप उपयोग के लिए एक फ़ाइल शामिल करना चाहते हैं, तो आपके पास आमतौर पर कुछ कोड होगा जो इस तरह दिखता है:

#import "someFile.h"

या चौखटे के मामले में:

#import <SomeLibrary/SomeFile.h>

क्योंकि Objective-C C प्रोग्रामिंग लैंग्वेज का सुपरसेट है, C के #includeस्टेटमेंट पर #import State is मेंटीन एक मामूली रिफाइनमेंट है । #Include स्टेटमेंट बहुत सरल है; यह संकलन के दौरान आपके कोड में शामिल फ़ाइल में पाई जाने वाली सभी चीज़ों की प्रतिलिपि बनाता है। यह कभी-कभी महत्वपूर्ण समस्याएं पैदा कर सकता है। उदाहरण के लिए, कल्पना करें कि आपके पास दो हेडर फाइलें हैं: SomeFileA.hऔर SomeFileB.h; SomeFileA.hशामिल है SomeFileB.h, और SomeFileB.hशामिल हैं SomeFileA.h। यह एक लूप बनाता है, और कोइम्पिलेटर को भ्रमित कर सकता है। इससे निपटने के लिए, सी प्रोग्रामर को इस प्रकार की घटना के खिलाफ गार्ड को घटित होने से लिखना होगा।

उपयोग करते समय #import, आपको इस समस्या के बारे में चिंता करने या इससे बचने के लिए हेडर गार्ड लिखने की आवश्यकता नहीं है। हालाँकि, #importअभी भी एक महिमामंडित कॉपी-एंड-पेस्ट एक्शन है, जिससे अन्य छोटे, लेकिन अभी भी बहुत खतरनाक मुद्दों (जैसे एक सम्मिलित फ़ाइल जिसे आपने अपने कोड में कहीं और घोषित किया है, ओवरराइडिंग के रूप में शामिल है) के बीच धीमी संकलन समय का कारण बनता है।

मॉड्यूल इसके आसपास पाने का एक प्रयास है। वे अब स्रोत कोड में कॉपी-एंड-पेस्ट नहीं हैं, लेकिन इसमें शामिल फ़ाइलों का क्रमबद्ध प्रतिनिधित्व है जो आपके स्रोत कोड में आयात किए जा सकते हैं, केवल जब और जहां उनकी आवश्यकता होती है। मॉड्यूल का उपयोग करके, कोड आमतौर पर तेजी से संकलित करेगा, और #include या का उपयोग करने की तुलना में अधिक सुरक्षित होगा #import

किसी फ़्रेमवर्क को आयात करने के पिछले उदाहरण पर लौटना:

#import <SomeLibrary/SomeFile.h>

इस पुस्तकालय को एक मॉड्यूल के रूप में आयात करने के लिए, कोड को बदल दिया जाएगा:

@import SomeLibrary;

यह Xcode का जोड़ा गया बोनस है जो इस परियोजना में SomeLibrary ढांचे को स्वचालित रूप से जोड़ता है। मॉड्यूल आपको केवल उन घटकों को शामिल करने की अनुमति देता है जिनकी आपको वास्तव में अपनी परियोजना में आवश्यकता है। उदाहरण के लिए, यदि आप AwesomeLibrary ढांचे में AwesomeObject घटक का उपयोग करना चाहते हैं, तो आमतौर पर आपको केवल एक टुकड़े का उपयोग करने के लिए सब कुछ आयात करना होगा। हालाँकि, मॉड्यूल का उपयोग करके, आप केवल उस विशिष्ट वस्तु को आयात कर सकते हैं जिसे आप उपयोग करना चाहते हैं:

@import AwesomeLibrary.AwesomeObject;

Xcode 5 में किए गए सभी नए प्रोजेक्ट के लिए, मॉड्यूल डिफ़ॉल्ट रूप से सक्षम हैं। यदि आप पुराने प्रोजेक्ट्स में मॉड्यूल का उपयोग करना चाहते हैं (और आपको वास्तव में करना चाहिए) तो उन्हें प्रोजेक्ट की बिल्ड सेटिंग्स में सक्षम करना होगा। एक बार जब आप ऐसा कर लेते हैं, तो आप अपने कोड में दोनों #importऔर @importकथनों का उपयोग बिना किसी चिंता के कर सकते हैं।


मेरे प्रोजेक्ट (Xcode 6) में कोई विकल्प नहीं है जो मैंने पहली बार मॉड्यूल को सक्षम करने के लिए Xcode 4 पर शुरू किया था। क्या मैं इसे किसी तरह मैन्युअल रूप से जोड़ सकता हूं?
विस्मय-ओ-

बिल्ड लक्ष्य iOS 6 है, मुझे लगता है कि यह मुद्दा है
बहुत

4

यह वर्तमान में केवल सिस्टम फ्रेमवर्क में निर्मित के लिए काम करता है। यदि आप #importऐप्पल की तरह उपयोग करते हैं तब भी UIKitऐप प्रतिनिधि में फ्रेमवर्क को आयात करते हैं इसे बदल दिया जाता है (यदि मॉड्यूल चालू है और सिस्टम फ्रेमवर्क के रूप में इसकी पहचान की गई है) और कंपाइलर इसे मॉड्यूल आयात करने के लिए रीमैप करेगा और हेडर फ़ाइलों का आयात नहीं करेगा । इसलिए #importवसीयत को छोड़ना उसके मॉड्यूल आयात में परिवर्तित होने के समान ही होगा जहाँ भी संभव हो


2

ऐसा लगता है कि XCode 7.xa के साथ क्लैंग मॉड्यूल को सक्षम करने के दौरान बहुत सारी चेतावनियां सामने आ रही हैं CLANG_ENABLE_MODULES

3 पार्टी पुस्तकालयों के साथ Xcode 7 के साथ निर्माण करते समय बहुत सारी चेतावनियों पर एक नज़र डालें


हां, मेरे पास भी यह मुद्दा है, लेकिन इसे NO पर सेट करने से सारी चेतावनी निकल जाती है। क्या ऐसा करने पर कोई साइड इफ़ेक्ट होगा ??
सत्येश्वरन

1

मॉड्यूल का उपयोग करने के कुछ फायदे हैं। आप इसका उपयोग केवल Apple के ढांचे के साथ कर सकते हैं जब तक कि मॉड्यूल मैप न बनाया जाए। @importपूर्व संकलित हेडर फ़ाइलों के लिए थोड़ा सा समान है जब .pchफ़ाइल को जोड़ा जाता है जो संकलन प्रक्रिया को ऐप ट्यून करने का एक तरीका है। इसके अतिरिक्त आपको पुराने तरीके से पुस्तकालयों को जोड़ने की आवश्यकता नहीं है, इसका उपयोग @importवास्तव में बहुत तेज और कुशल है। यदि आप अभी भी एक अच्छे संदर्भ की तलाश में हैं तो मैं आपको इस लेख को पढ़ने की अत्यधिक सलाह दूंगा ।


0

इतिहास:

#include => #import => .pch => @import

#include बनाम #import
.pch - पूर्वनिर्धारित हेडर

मापांक - @import

Product Name == Product Module Name 

@moduleघोषणा कंपाइलर से कहती है कि वह फ्रेमवर्क के एक प्री-कम्पोस्ड बाइनरी को लोड करने के लिए जो बिल्डिंग टाइम को कम करता है । मॉड्यूलर फ्रेमवर्क में .modulemap[के बारे में]

यदि मॉड्यूल सुविधा Xcode प्रोजेक्ट में सक्षम है #includeऔर #importनिर्देश स्वचालित रूप से परिवर्तित हो जाते हैं @importजो सभी फायदे लाता है

यहां छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.