@import vs #import - iOS 7
WWDC 비디오 "Implementing Ui on iOS"에서 설명한 바와 같이 iOS 7의 새로운 기능 중 일부와 이미지 효과 중 일부를 사용하고 있습니다., 「」를 참조해 주세요.UIImage
다음과 같이 UIKit을 가져오는 카테고리를 통해 확장되었습니다.
@import UIKit;
다른 세션 비디오에서 본 것 같은데 찾기가 어려워요.사용 시기에 대한 배경 정보를 찾고 있습니다.Apple 프레임워크에서만 사용할 수 있습니까?이 컴파일러를 사용하면 이전 코드를 갱신할 수 있는 이점이 있습니까?
모듈(Modules) 또는 "의미적 Import(semantic import)"라는 새로운 기능입니다.세션 205 및 404에 대한 자세한 내용은 WWDC 2013 비디오에 있습니다.미리 컴파일된 헤더를 더 잘 구현한 것입니다.iOS 7 및 Mavericks의 모든 시스템 프레임워크와 함께 모듈을 사용할 수 있습니다.모듈은 프레임워크 실행 파일과 그 헤더를 함께 패키징한 것으로, 보다 안전하고 효율적이라고 선전되고 있습니다.#import
.
★★★★★★★★★★★★★★★★의 큰 중 @import
프로젝트 설정에서 프레임워크를 추가할 필요가 없습니다.이 작업은 자동으로 수행됩니다.즉, 더하기 버튼을 클릭하여 프레임워크(골든 툴박스)를 검색한 후 "프레임워크" 그룹으로 이동할 수 있습니다.그러면 많은 개발자들이 "Linker error"라는 암호 메시지에서 벗어날 수 있습니다.
실제로 키워드를 사용할 필요는 없습니다.모듈 사용에 동의하는 경우#import
★★★★★★★★★★★★★★★★★」#include
명령어는 사용되도록 매핑됩니다.@import
곳에서 )를 .즉, 소스 코드(또는 다른 곳에서 다운로드한 라이브러리의 소스 코드)를 변경할 필요가 없습니다.모듈을 사용하면 빌드 성능도 향상됩니다.특히 PCH를 잘 사용하지 않았거나 프로젝트에 작은 소스 파일이 많이 있는 경우에는 더욱 그렇습니다.
모듈은 대부분의 Apple 프레임워크(UIKit, MapKit, GameKit 등)에 대해 사전 구축되어 있습니다.사용자가 직접 작성한 프레임워크와 함께 사용할 수 있습니다.Xcode에서 Swift 프레임워크를 작성하면 자동으로 작성되며 Apple 또는 서드파티 라이브러리의 ".modulemap" 파일을 직접 작성할 수 있습니다.
코드 완료를 사용하면 사용 가능한 프레임워크 목록을 볼 수 있습니다.
Xcode 5의 새 프로젝트에서는 모듈이 기본적으로 활성화되어 있습니다.이전 프로젝트에서 활성화하려면 프로젝트 빌드 설정으로 이동하여 "모듈"을 검색한 후 "모듈 활성화"를 "예"로 설정하십시오."Link Frameworks"도 "YES"여야 합니다.
Xcode 5와 iOS 7 또는 Mavericks SDK를 사용해야 하지만 이전 OS(iOS 4.3 등)용으로도 출시할 수 있습니다.모듈은 코드 작성 방법이나 소스 코드를 변경하지 않습니다.
WWDC 슬라이드:
- 프레임워크의 전체 의미 설명을 가져옵니다.
- 헤더를 해석할 필요가 없습니다.
- 프레임워크의 인터페이스를 Import하는 보다 좋은 방법
- 이진 표현을 로드합니다.
- 미리 컴파일된 헤더보다 유연함
- 정의의 면역( 로 defin defin defin immune immune예예예예예예예예예예예예예:
#define readonly 0x01
)- 새 프로젝트에 대해 기본적으로 실행됨
모듈을 명시적으로 사용하려면:
#import <Cocoa/Cocoa.h>
@import Cocoa;
다음 표기로 Import할 수 있는 헤더는 1개뿐입니다.
@import iAd.ADBannerView;
Xcode에서는 서브모듈이 자동으로 완성됩니다.
좋은 답변은 책 Learning Cocoa with Objective-C(ISBN: 978-1-491-90139-7)에서 찾을 수 있습니다.
모듈은 파일 및 라이브러리를 프로젝트에 포함 및 연결하기 위한 새로운 수단입니다.모듈의 기능과 이점을 이해하려면 Objective-C 및 #import 스테이트먼트의 이력을 되돌아보는 것이 중요합니다.사용할 파일을 포함시키고 싶을 때는 일반적으로 다음과 같은 코드가 있습니다.
#import "someFile.h"
또는 프레임워크의 경우:
#import <SomeLibrary/SomeFile.h>
C에 #의 Objective-C' C의 입니다.#include
된 모든 합니다.#이렇게 하면 됩니다. 컴파일 중에 포함된 파일에서 발견된 모든 내용을 코드로 복사합니다.이로 인해 중대한 문제가 발생할 수 있습니다. 두 파일이 해 봅시다.헤더 파일은 예어들 for 、 두고고고:: 。SomeFileA.h
★★★★★★★★★★★★★★★★★」SomeFileB.h
SomeFileA.h
SomeFileB.h
, , , , 입니다.SomeFileB.h
SomeFileA.h
이로 인해 루프가 생성되어 코임파일러가 혼동될 수 있습니다.이 문제를 해결하기 위해 C 프로그래머는 이러한 유형의 이벤트가 발생하지 않도록 가드를 작성해야 합니다.
「」를 사용하고 #import
하지 않아도 않아도 ★★★★★★★★★★★★★★.#import
는, 미화된 앤 액션에 않기 에, 그 의 매우 한 문제, 파일이 코드로 등)의이 늦어지고 . 컴파일 시간이 늦어지고 있습니다.
이치노이러한 파일은 더 이상 소스 코드에 복사하여 붙여넣기하는 것이 아니라 필요할 때만 소스 코드로 가져올 수 있는 포함된 파일의 일련화된 표현입니다.으로 # 또는 #include #include #include #include를 보다 코드가 더 빨리 컴파일되고합니다.#import
.
이전 프레임워크 Import 예시로 돌아가기:
#import <SomeLibrary/SomeFile.h>
이 라이브러리를 모듈로 Import하려면 코드가 다음과 같이 변경됩니다.
@import SomeLibrary;
SomeLibrary 프레임워크를 자동으로 프로젝트에 링크하는 Xcode 추가.모듈에서는 실제로 필요한 컴포넌트만 프로젝트에 포함할 수 있습니다.예를 들어, AwesomeLibrary 프레임워크에서 AwesomeObject 컴포넌트를 사용하려면 보통 1개의 컴포넌트를 사용하기 위해 모든 것을 Import해야 합니다.단, 모듈을 사용하면 사용할 특정 객체만 Import할 수 있습니다.
@import AwesomeLibrary.AwesomeObject;
Xcode 5로 작성된 모든 신규 프로젝트에 대해 모듈은 기본적으로 활성화되어 있습니다.이전 프로젝트에서 모듈을 사용하려면(그리고 실제로 사용해야 함) 프로젝트의 빌드 설정에서 모듈을 활성화해야 합니다. 둘 다 쓸 수요.#import
★★★★★★★★★★★★★★★★★」@import
코드의 스테이트먼트를 조합할 수 있습니다.
@import Module(ObjC) 또는 Semantic Import
를 사용하여 일반적인 모듈이 아닌
//as example
#include <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
이력:
[#include -> #import] -> [사전 컴파일된 헤더 .pch] -> @import Module (ObjC); -> [import Module (Swift)]
LLVM 모듈의 일부입니다.
@import <module_name>;
선언문은 빌드 시간을 단축하는 모듈의 사전 컴파일된 바이너리를 로드(컴파일)하도록 컴파일러에 지시합니다.이전에는 컴파일러가 종속성을 실행할 때마다 컴파일했지만 지금은 컴파일하여 로드해야 합니다.
//previously
run into dependency -> compile dependency
run into dependency -> compile dependency
//@import
compile dependency
run into dependency -> load compiled binary
run into dependency -> load compiled binary
[Modulemap] - 모듈과 헤더 사이의 브리지
X코드
Enable Modules(C and Objective-C)(CLANG_ENABLE_MODULES)
(랑랑)#include, #import
으로 디디 to direct direct direct direct direct 로 변환됩니다.@import
모든 이점을 가져다 줍니다. Modulemap
/서브/서브 사이의 맵을 포함하고 때문에 하게 실행할 수 .
-fmodules
#include, #import -> @import
Link Frameworks Automatically(CLANG_MODULES_AUTOLINK)
- 시스템 모듈 자동 링크를 활성화합니다.활성화 필요CLANG_ENABLE_MODULES
. 를 사용하면 할 수 -framework <framework_name>
#import, @import(Objective-C), import(Swift)
경우 - --fno-autolink
CLANG_ENABLE_MODULS == NO 및 CLANG_MODULS_AUTOLINK == NO
「 」 )을 취급하는 는,#import <UIKit/UIKit.h>
수동 링크(자동 링크)에는 다음 두 가지 종류가 있습니다.
추가
General -> Frameworks and Libraries or Frameworks, Libraries, and Embedded Content
Build Settings -> Other Linker Flags(OTHER_LDFLAGS) -> -framework <module_name>
다음 경우 다음 오류가 발생합니다.
Undefined symbol: _OBJC_CLASS_$_UIView
Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_UIView", referenced from:
objc-class-ref in ClassB.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1
CLANG_ENABLE_MODULES
(디세이블입니다.CLANG_MODULES_AUTOLINK
.
리버스 엔지니어링
otool -l <binary>
//-l print the load commands
//find LC_LINKER_OPTION
//cmd LC_LINKER_OPTION
현재는 빌트인 시스템 프레임워크에서만 동작합니다.「 」를 사용하고 #import
있습니다.UIKit
앱 위임의 프레임워크는 교체되고(모듈이 켜져 있고 시스템 프레임워크로 인식되는 경우), 컴파일러는 헤더 파일의 Import가 아닌 모듈 Import로 다시 매핑합니다. ★★★★★★★★★★★★★★★★★★★★★★★#import
는 가능한 경우 .
7 이후 XCode 7.x에서 모듈을 경고가 .CLANG_ENABLE_MODULES
서드파티 라이브러리를 사용하여 Xcode 7을 빌드할 때 발생하는 많은 경고를 살펴봅니다.
모듈을 사용하면 몇 가지 이점이 있습니다.모듈 맵이 생성되지 않는 한 Apple 프레임워크에서만 사용할 수 있습니다. @import
는, 프리 인스톨 ..pch
컴파일 프로세스를 조정하는 방법인 파일입니다. 옛날.@import
훨씬 빠르고 효율적입니다.그래도 좋은 참고 자료를 찾으신다면 이 기사를 꼭 읽어보시길 권합니다.
언급URL : https://stackoverflow.com/questions/18947516/import-vs-import-ios-7
'programing' 카테고리의 다른 글
Xcode의 숨겨진 특징 (0) | 2023.04.15 |
---|---|
NPM이 스택되어 같은 오류가 발생함EISDIR: 디렉토리에서 잘못된 조작, 오류 시 읽기(네이티브) (0) | 2023.04.15 |
WPF 응용 프로그램의 전체 화면 (0) | 2023.04.15 |
Initialize Component()는 무엇을 하며 WPF에서는 어떻게 동작합니까? (0) | 2023.04.15 |
목록의 값을 Excel로 내보내기 (0) | 2023.04.15 |