2010-11-21 5 views

답변

12

아무 것도 포장하지 않아도됩니다. 그냥 id으로 캐스팅하고 배열에 추가하십시오. CFType에서 파생 된 CoreFoundation 유형 ("Ref"로 끝나는 모든 것)에 대해이 작업을 수행 할 수 있습니다.

또는 NSMutableArray *를 CFMutableArrayRef로 캐스팅하고 CFArrayAppendValue()를 호출 할 수 있습니다. 이것은 더 형식 안전하지 않습니다. 배열이 생성 될 때 지정된 retain/release 콜백을 호출합니다. (주목할만한 예외 예외는 - [NSDictionary setValue : forKey :] 키를 복사하는 반면, 해당 CFDictionary 함수는 그렇지 않습니다. 때때로 "변경 가능한"객체 (예 : NSURLConnection, 데이터 소 -far 값으로 사용), 해시가 변경되지 않는다는 조건을 위반하지 않는 한 안전합니다.)

CoreFoundation 유형은 '일반'C에서 사용할 수있는 OO 유형입니다. 영리한 마법을 사용하면 (Apple이 CF와 ObjC 런타임을 모두 작성하므로이 작업을 수행 할 수 있습니다.) NSString, NSArray 및 NSDictionary와 같은 유형의 인스턴스는 기본적으로 CFString, CFArray 및 CFDictionary의 "실제"인스턴스입니다. CF 유형은 유형 계층에 있으며, 그 루트는 CFType입니다. 주목할만한 방법은 CFRetain, CFRelease, CFEqual, CFHash 및 CFCopyDescription입니다. 이것들은 -retain, -release, -isEqual :, -hash, -description에 거의 해당하지 않습니다 (-description은 자동으로 릴리즈되고, NULL/nil의 처리가 다릅니다). Apple은이 "유료 브리징"또는 "상호 교환 가능한 데이터 유형"이라고 부릅니다 (IDT 기사는 더 이상 Mac 개발자 센터에 없습니다). Ridiculousfish에는 "Bridge"이라고하는 좋은 기사가 있습니다.

이것이 의미하는 바는 대부분 CF 유형을 Objective-C 객체처럼 처리 할 수 ​​있다는 것입니다. 애플은 이것을 특별히 명확하게하지 않았지만, "수신자 부담 브리징"에 대한 모든 언급에 덧붙여, 그들은 상호 교환 가능하다고 가정하는 것들이있다.

  • NSMakeCollectable()은 CFTypeRef를 취하여 id를 반환합니다 (iOS에서는 관련이 없지만 Mac OS 10.5 이상에서 관련성 높은 가비지 수집을 가능하게 함).
  • @property (nonatomic, retain) __attribute__((NSObject)) ABAddressBookRef foo;과 같은 내용은 실제로 "그것이 Objective-C 인스턴스 인 것처럼 보냅니다."라고 의미합니다.
  • CALayer.contents 속성은 id 유형이지만 CGImageRef 만 지원됩니다 (-drawRect : draw하는 CABackingStore도 지원함).

추가 재미있는 일은 CFAutorelease을 정의하는 것입니다.

+0

감사합니다. – Cyprian

관련 문제