@import vs #import-iOS 7


432

WWDC 비디오 "iOS에서 참여 UI 구현"에 설명 된대로 일부 새로운 iOS 7 기능을 사용하고 일부 이미지 효과를 사용하고 있습니다. 세션의 소스 코드 내에서 흐림 효과를 만들기 위해 UIImageUIKit을 가져 오는 범주를 통해 다음과 같이 확장되었습니다.

@import UIKit;

다른 세션 비디오에서 이것에 대해 뭔가를 봤지만 찾지 못했습니다. 이 사용 시점에 대한 배경 정보를 찾고 있습니다. Apple 프레임 워크에서만 사용할 수 있습니까? 이 컴파일러 지시문을 사용하면 이전 코드로 돌아가 업데이트 할만큼 충분한 이점이 있습니까?


답변:


838

Modules 또는 "semantic import" 라는 새로운 기능 입니다. WWDC 2013 비디오에는 세션 205404에 대한 자세한 정보가 있습니다 . 미리 컴파일 된 헤더를 더 잘 구현합니다. iOS 7 및 Mavericks의 시스템 프레임 워크와 함께 모듈을 사용할 수 있습니다. 모듈은 프레임 워크 실행 파일과 함께 패키징되며 헤더이며보다 안전하고 효율적으로 선전됩니다 #import.

사용의 가장 큰 장점 중 하나는 @import것입니다 이 자동으로 이루어집니다, 프로젝트 설정에서 프레임 워크를 추가 할 필요가 없습니다 . 즉, 더하기 버튼을 클릭하고 프레임 워크 (골든 도구 상자)를 검색 한 다음 "Frameworks"그룹으로 이동하는 단계를 건너 뛸 수 있습니다. 암호화 된 "링커 오류"메시지에서 많은 개발자를 구할 수 있습니다.

실제로 @import키워드 를 사용할 필요는 없습니다 . 당신이 선택 된 경우 모듈을 사용하는 모든 #import#include지침은 사용하는 매핑됩니다 @import자동으로. 즉, 소스 코드 (또는 다른 곳에서 다운로드 한 라이브러리의 소스 코드)를 변경할 필요가 없습니다. 모듈을 사용하면 특히 PCH를 잘 사용하지 않았거나 프로젝트에 작은 소스 파일이 많은 경우 빌드 성능도 향상됩니다.

모듈은 대부분의 Apple 프레임 워크 (UIKit, MapKit, GameKit 등)를 위해 사전 구축되었습니다. 직접 만든 프레임 워크와 함께 사용할 수 있습니다. Xcode에서 Swift 프레임 워크를 생성하면 자동으로 생성되며 Apple 또는 타사 라이브러리에 대해 직접 ".modulemap"파일을 직접 생성 할 수 있습니다 .

코드 완성을 사용하여 사용 가능한 프레임 워크 목록을 볼 수 있습니다.

여기에 이미지 설명을 입력하십시오

Xcode 5의 새 프로젝트에서는 기본적으로 모듈이 활성화되어 있습니다. 이전 프로젝트에서이를 활성화하려면 프로젝트 빌드 설정으로 이동하여 "모듈"을 검색하고 "모듈 사용"을 "예"로 설정하십시오. "링크 프레임 워크"도 "예"여야합니다.

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 세션을 보았습니다. Doug Gregor (LLVM 녀석)가 발표 한 프레젠테이션은 정말 훌륭했습니다. 여기에 장점을 설명하는 C ++ 모듈
강의도

3
@ nevan-- 답변 주셔서 감사합니다. 방금 모듈이 현재 타사 및 자신의 프레임 워크를 지원하지 않는다고 덧붙였습니다.
jamdaddy25

이것을 자신의 수업에 사용할 수 있습니까?
cfischer

5
적절한 module.map이 제공되면 타사 프레임 워크를 @import 할 수 있어야한다고 생각합니다. LLVM clang 모듈 설명서 : clang.llvm.org/docs/Modules.html#module-map-language
bames53

1
오, 실제로 @import sqlite3나는 그것을 위해 내 자신의 module.map을 만들었고 sqlite가 OS X에 포함되어 있고 module.map을 제거했다는 것을 깨달았을 때 컴파일러가 오래된 모듈을 계속 사용했기 때문에 효과 가있는 것처럼 보입니다 .
bames53

46

Objective-C를 사용한 Learning Cocoa 책에서 찾을 수있는 좋은 답변 (ISBN : 978-1-491-90139-7)

모듈은 파일과 라이브러리를 프로젝트에 포함하고 연결하는 새로운 수단입니다. 모듈의 작동 방식과 그 이점을 이해하려면 Objective-C의 역사와 #import 문을 다시 살펴 보는 것이 중요합니다. 사용할 파일을 포함 할 때마다 일반적으로 다음과 같은 코드가 있습니다.

#import "someFile.h"

또는 프레임 워크의 경우 :

#import <SomeLibrary/SomeFile.h>

Objective-C는 C 프로그래밍 언어의 상위 집합이므로 #import #include문 은 C의 진술을 약간 수정 한 것 입니다. #include 문은 매우 간단합니다. 컴파일하는 동안 포함 된 파일에서 찾은 모든 것을 코드에 복사합니다. 때때로 심각한 문제가 발생할 수 있습니다. 예를 들어, 두 개의 헤더 파일이 상상 : SomeFileA.hSomeFileB.h; SomeFileA.h포함SomeFileB.h 하고 SomeFileB.h포함 SomeFileA.h합니다. 이것은 루프를 만들고 코임 필러를 혼동시킬 수 있습니다. 이를 처리하기 위해 C 프로그래머는 이러한 유형의 이벤트가 발생하지 않도록 가드를 작성해야합니다.

를 사용할 #import때이 문제에 대해 걱정하거나 헤더 가드를 작성하지 않아도됩니다. 그러나 #import여전히 영광스러운 복사 후 붙여 넣기 작업이므로 다른 작지만 여전히 매우 위험한 문제 (예 : 자신의 코드에서 다른 곳에서 선언 한 내용을 덮어 쓰는 포함 된 파일)간에 컴파일 시간이 느려집니다.

모듈은이 문제를 해결하려는 시도입니다. 더 이상 소스 코드로 복사하여 붙여 넣기가 아니라 필요할 때 언제 어디서나 소스 코드로 가져올 수있는 포함 된 파일의 직렬화 된 표현입니다. 모듈을 사용하면 코드는 일반적으로 #include 또는를 사용하는 것보다 더 빠르게 컴파일되고 안전 #import합니다.

프레임 워크 가져 오기의 이전 예제로 돌아 가기 :

#import <SomeLibrary/SomeFile.h>

이 라이브러리를 모듈로 가져 오려면 코드가 다음과 같이 변경됩니다.

@import SomeLibrary;

이는 SomeLibrary 프레임 워크를 프로젝트에 자동으로 연결하는 Xcode의 추가 보너스를 제공합니다. 모듈을 사용하면 실제로 필요한 구성 요소 만 프로젝트에 포함시킬 수 있습니다. 예를 들어 AwesomeLibrary 프레임 워크에서 AwesomeObject 구성 요소를 사용하려면 일반적으로 한 조각 만 사용하기 위해 모든 항목을 가져와야합니다. 그러나 모듈을 사용하면 사용하려는 특정 객체를 가져올 수 있습니다.

@import AwesomeLibrary.AwesomeObject;

Xcode 5로 작성된 모든 새 프로젝트의 경우 기본적으로 모듈이 활성화되어 있습니다. 이전 프로젝트에서 모듈을 사용하려면 (그리고 실제로해야 함) 프로젝트의 빌드 설정에서 모듈을 활성화해야합니다. 일단 그렇게 하면 걱정없이 코드의 #import@import문을 함께 사용할 수 있습니다 .


내 프로젝트 (Xcode 6)에는 모듈을 활성화하기 위해 Xcode 4에서 처음 시작한 옵션이 없습니다. 어떻게 든 수동으로 추가 할 수 있습니까?
Awesome-o

빌드 대상은 iOS 6입니다. 이것이 문제라고 생각합니다
Awesome-o

4

현재 내장 된 시스템 프레임 워크에서만 작동합니다. #importapple처럼 사용하는 경우 여전히 UIKit앱 위임에서 프레임 워크를 가져 오면 프레임이 교체되고 (모듈이 켜져 있고 시스템 프레임 워크로 인식되는 경우) 컴파일러는 헤더 파일을 가져 오지 않고 모듈 가져 오기로 다시 매핑합니다 . 따라서 #import어쨌든 가능한 경우 모듈 가져 오기로 변환 된 것과 동일합니다.



1

모듈을 사용하면 몇 가지 이점이 있습니다. 모듈 맵을 만들지 않으면 Apple의 프레임 워크에서만 사용할 수 있습니다. @import는 파일에 추가 될 때 .pch컴파일 프로세스를 조정하는 방법 인 사전 컴파일 헤더 파일과 약간 비슷합니다 . 또한 이전 방식으로 라이브러리를 추가 할 필요가 없습니다 @import. 실제로 사용하는 것이 훨씬 빠르고 효율적입니다. 그래도 좋은 참고 자료를 찾고 있다면 이 기사 를 읽는 것이 좋습니다 .


0

역사:

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

#include vs #import
.pch-사전 컴파일 된 헤더

모듈- @import

Product Name == Product Module Name 

@module선언은 빌드 시간단축시키는 사전 컴파일 된 프레임 워크 바이너리 를로드하도록 컴파일러에 지시 합니다 . 모듈 식 프레임 워크에 포함 된 .modulemap정보

Xcode 프로젝트에서 모듈 기능이 활성화되어 #include있고 #import지시문이 자동으로 변환되어 @import모든 이점이있는 경우

여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.