2012-02-19 4 views
41

CF 및 NS 개체가 모두 존재하며 왜 똑같은 것으로 보이고 수신자 부담 브리징을 통해 상호 교환 할 수 있는지 이해하려고합니다. 말하자면, CFArray와 NSArray가 똑같은 일을하고, 그것들을 자유롭게 캐스팅 할 수 있다면, 둘 다 존재하는 점은 무엇일까요? 하나를 다른 것 위에 사용할 때의 어림짐작은 있습니까? CF 객체는 이전 프레임 워크의 레거시 객체입니까? 이것에 대한 어떤 통찰력이라면 크게 감사하겠습니다.CF 개체와 NS 개체

+3

a) 모든 CF 유형이 NS 등가물을 가지고있는 것은 아니며, 그 반대도 마찬가지이며, b) 접두어 이외의 이름이 모두 "수신자 부담 브리지"와 같은 것은 아닙니다. 예를 들어'CFBundle'과'NSBundle'은 그렇지 않습니다.항상 [docs] (https://developer.apple.com/library/mac/documentation/General/Conceptual/CocoaEncyclopedia/Toll-FreeBridgin/Toll-FreeBridgin.html). –

답변

58

위해 귀하의 질문에 대답하려면, 그 점은 모두 무엇을 기존의 것

  1. ? 몇 가지 이유가 있습니다.

    Carbon API와 같은 C API를 제공하려는 경우 참조 된 계산 객체의 배열 및 사전이 필요하면 Core Foundation (CFArray을 제공)과 같은 라이브러리가 필요하며 물론 필요합니다. C API가 있어야합니다.

    제 3자가 Windows에서 사용할 라이브러리를 작성하려면 (예를 들어) C API를 제공해야합니다.

    운영 체제의 커널과 인터페이스하는 등 저급 라이브러리를 작성하려는 경우 Objective-C 메시징의 오버 헤드를 원하지 않으면 C API가 필요합니다.

    그래서 순수한 C 라이브러리 인 Core Foundation을 사용하는 것이 좋습니다.

    그러나 Objective-C에서 더 높은 수준의 더 즐거운 API를 제공하려는 경우 배열, 사전, 참조 카운트 된 개체 등을 나타내는 Objective-C 개체가 필요합니다. 따라서 Objective-C 라이브러리 인 Foundation이 필요합니다.

  2. 어느 쪽을 사용해야합니까? 일반적으로 Objective-C 인터페이스를 사용하는 것이 더 즐겁기 때문에 언제든지 Objective-C 클래스 (예 : NSArray)를 사용해야합니다. myArray.count (또는 [myArray count])은 CFArrayGetCount(myArray)보다 읽기 쉽고 쓰기 쉽습니다. Core Foundation API는 Objective-C가없는 플랫폼 또는 Core Foundation API가 제공하지만 Objective-C 객체가 부족한 기능이 필요한 경우에만 사용해야합니다. 예를 들어 참조 수가 계산되지 않은 객체를 저장할 수있는 CFArray 또는 CFDictionary을 만들 때 콜백을 지정할 수 있습니다. NSArrayNSDictionary 클래스는 그렇게 할 수 없습니다. 항상 참조 카운팅 된 객체를 저장한다고 가정합니다.

  3. CF 개체는 레거시 개체입니까? 전혀. 실제로 Nextstep은 Objective-C Foundation 라이브러리와 공용 (공용) Core Foundation 라이브러리만으로 수년간 존재 해왔다. Apple이 Carbon API와 Cocoa API를 동일한 하위 수준의 운영 체제 기능 위에 모두 지원해야 할 때, 그들은 Core Foundation을 만들었습니다 (또는 공개했습니다).

부수적으로, Core Foundation의 일부는 오픈 소스입니다. Mac OS X 10.10.5의 오픈 소스 부분은 https://opensource.apple.com/source/CF/CF-1153.18/입니다. 나는 CFRunLoopCFStream의 소스 코드가 매우 유익하다는 것을 알았다.

+0

굉장한 요약, 롭. 감사! – Eric

1

CF는 CoreFoundation을 나타냅니다. 이름에 CF가있는 노출 된 객체는 C로 작성된 일반적인 Core Foundation 객체입니다. 모든 객체는 Objective-C 영역에서 코코아 터치 파운데이션 친구와 연결되어 수신자 부담입니다. 보통 불투명 한 포인터입니다.

NS는 Mac OS X이 구축 된 이전 OS 인 NextStep을 나타냅니다. NS 접두사를 붙인 객체는 대개 Objective-C 또는 C 또는 일부 C++로만 작성됩니다.

정말 각 개체에 필요한 작업에 따라 다릅니다. NSString을 사용하여 순수 Objective-C에서 작업하는 것이 확실히 쉬울 것입니다. 그런 다음 CFString과 함께 C와 Objective-C를 함께 사용하는 것이지만, CF 개체가 수행 할 수있는 몇 가지 작업이 NS 개체가 ' t (주로 매우 낮은 수준의 물건). CF 객체는 Ref, 변형 및 검사에서 NS 객체보다 훨씬 더 많이 사용합니다.

(향후 CoreGraphics 용 CG, UIKit 용 UI, QuickLook 용 QL, AVFoundation 용 AV, MediaPlayer 용 MP, MessageFoundation 용 MF, GLKit 용 GL 및 MapKit 용 MK) 내가 무엇이든 놓친다면 기꺼이 편집 할 것입니다.)

+2

이 답변은 기본적으로 정확하지만 약간의 혼란을 야기 할 수 있습니다. Core Foundation은 "Objective C 기반 객체를 사용하지 않습니다." 어떤 경우에는 Cocoa 객체가 Core Foundation 객체를 사용하여 구현되지만 다른 방법으로는 구현되지 않습니다. 코코아 앱은 CoreFoundation.framework를 연결해야합니다. Core Foundation 애플리케이션은 NSString과 그 ObjC 친구들을 제공하는 Foundation.framework를 연결할 필요가 없습니다. 또한 CF를 "Apple의 내부 개체"라고 부르지도 않습니다. 그것들은 완전 공개 API이며 Core Text와 같은 다른 핵심 프레임 워크와 함께 일반적으로 사용됩니다. 일반적으로 CF가 필요하지 않으면 NS를 사용해야합니다. –

+0

지금 수정 중입니다. THanks – CodaFi

+0

CF 객체가 정적으로 할당되었다고 할 때 당신은 무엇을 의미합니까? –

3

이 질문에 대한 몇 가지 사실이 있습니다. 핵심 재단은 운영의 두뇌입니다. 주로 C로 작성되었습니다. 애플이 NEXT와 API를 인수하여 만들어졌으며 그들에게 많은 빚을졌습니다. NS * 클래스는 종종 CF * 유형 위에 구축 된 Objective C 추상 인터페이스입니다. 그래서 CFArray와 NSArray가 모두 존재하는 이유를 묻는다면 실제로 대답하지 못한다는 것입니다. NSArrays 입니다. CFArrays, NSStrings CFStrings입니다. 따라서 무료 전화 브리지가 가능합니다.

더 재미 있고 자세한 내용은 this blog post을 참조하십시오.

11

코어 파운데이션은 다양한 공통 데이터 구조에 대한 C API입니다. 이러한 데이터 구조의 대부분은 코코아에서 등가물을 가지고 있지만 전부는 아닙니다. 동등한 것의 대부분은 무료로 다리를 놓고, 그 (것)들이 모두 교환 할 수 있 사용되는 것을 허용한다, 그러나 모두.

수신자 부담 브리징은 매우 영리한 구현 트릭입니다. 기본 세부 사항을 원하면 @Matt Wilding이 지적한 ridiculous_fish post을 참조하십시오. 이 주제에 대해 가장 권위있는 내용입니다 (또한 모든 내용이 어떻게 작동하는지 설명하는 iOS:PTL 19 장에 대한 주요 영향). 그러나 대부분의 목적에 대해서는 별 문제가되지 않습니다. 매트가 말한 것처럼, 일반적으로 NSArrayCFArrayRef과 동일하다고 가장 할 수 있습니다. 이것은 많은 경우에 실제로 사실이 아니지만 때로는 사실이며 거의 대부분 시간에 가깝습니다. @"stuff"stuff을 포함하는 NSString과 같습니다. 대부분 사실이지만 정확하지는 않습니다.

OS 9이 OS X로 옮겨 졌을 때 Objective-C와 유사한 데이터 구조에 C 액세스를 제공하는 것이 매우 편리했습니다. 오늘날 많은 저급 프레임 워크는 성능상의 이유로 C API를 노출합니다. CF를 "유산"또는 "내부"라고 생각해서는 안됩니다. 당신은 저수준이라고 생각해야하며, 그것이 제공하는 힘이 필요하거나 그것을 필요로하는 저수준의 프레임 워크를 다룰 때만 사용해야한다.

CF 개체는 종종 NS 개체보다 융통성이 있습니다. 예를 들어, CFDictionaryRef은 비 객체 키와 값을 포함 할 수 있지만 NSDictionary은 포함 할 수 없습니다. (물론 그들은 무료 전화이므로 브릿지를 사용하지 않으므로 CFDictionaryRef을 유지하지 않고 NSDictionary으로 처리하십시오.)

Apple에서 새로운 프레임 워크를 발표함에 따라, 이들은 종종 C API를 먼저 노출 한 다음 나중에 Objective-C API를 추가합니다. 이것이 매일 사용하지 않더라도 Core Foundation을 배우는 것이 좋은 생각입니다. 그러나 가능한 경우 일반적으로 ObjC를 사용해야합니다.

+0

롭, 좋은 설명. 당신은 내가 흥미 있다고 생각했던 부분을 제기했습니다. @ "string"과 "string"을 포함하는 NSString의 차이점은 무엇입니까? 나는 "@"string "이 암시적인 NSString에 있다고 생각했다 ... – Eric

+5

@"string "은 실제로 NSString의 (sort-of) 서브 클래스 인'__NSCFConstantString'이다. ("Sort-of"는 서브 클래스와 완전히 똑같은 무료 전화 교량 클래스이기 때문에) 상수 문자열은 힙이 아닌 __TEXT 세그먼트에 있습니다 (별도로 저장되는 기본 cstring과 함께) , 그들은'retain'과'release' 호출을 무시합니다. –

관련 문제