2010-11-21 35 views

Trả lời

12

Bạn không cần phải quấn nó vào bất cứ thứ gì. Chỉ cần truyền nó đến id và thêm nó vào mảng. Bạn có thể làm điều này cho bất kỳ loại CoreFoundation nào có nguồn gốc từ CFType (bất kỳ thứ gì kết thúc bằng "Ref").

Hoặc, bạn có thể truyền NSMutableArray * vào CFMutableArrayRef và gọi CFArrayAppendValue(). Điều này không an toàn hơn; nó gọi các lệnh gọi lại/giải phóng được chỉ định khi mảng được tạo. (Ngoại lệ ngoại lệ đáng chú ý là - [NSDictionary setValue: forKey:] sao chép khóa, trong khi chức năng CFDictionary tương ứng thì không. Đôi khi thật tốt khi có một từ điển được khóa bởi một đối tượng "có thể thay đổi" (ví dụ: NSURLConnection, với dữ liệu) -giá trị như là các giá trị); bạn an toàn miễn là bạn không vi phạm yêu cầu rằng băm không thay đổi.)

Loại đối sánh là loại OO có thể được sử dụng trong "đồng bằng" C. Sử dụng một số phép thuật thông minh (Apple có thể làm điều này bởi vì họ viết cả CF và ObjC runtimes), các thể loại như NSString, NSArray, và NSDictionary là (theo mặc định) các trường hợp "thực sự" của CFString, CFArray và CFDictionary. Các loại CF nằm trong hệ thống phân cấp loại, gốc của nó là CFType; các phương pháp đáng chú ý là CFRetain, CFRelease, CFEqual, CFHash và CFCopyDescription. Những tương ứng lỏng lẻo với -retain, -release, -isEqual :, -hash, và -description (ngoại trừ các ký tự đó được tự động phát hành thêm, và chúng có cách xử lý khác nhau của NULL/nil). Apple gọi đây là "cầu nối miễn phí" hoặc "Các loại dữ liệu có thể hoán đổi" (bài viết IDT không còn trên Trung tâm Mac Dev). Ridiculousfish có một bài viết hay gọi là "Bridge".

Điều này có nghĩa là bạn có thể, đối với hầu hết các phần, xử lý các loại CF như thể chúng là đối tượng Mục tiêu-C. Apple đã không thực hiện điều này đặc biệt rõ ràng, nhưng ngoài tất cả các đề cập đến "cầu nối miễn phí", có một số công cụ cho rằng chúng có thể hoán đổi cho nhau.

  • NSMakeCollectable() lấy CFTypeRef và trả về id (và cho phép thu thập rác, không liên quan trên iOS nhưng có liên quan cao trên Mac OS 10.5+).
  • Các nội dung như @property (nonatomic, retain) __attribute__((NSObject)) ABAddressBookRef foo; có nghĩa là "gửi nó -ngắn và -nhận lại như thể đó là một cá thể Mục tiêu-C".
  • Thuộc tính CALayer.contents có loại id nhưng tài liệu duy nhất mà nó hỗ trợ là CGImageRef (nó cũng hỗ trợ CABackingStore, là gì -drawRect: rút ra).

Những điều thú vị khác bạn có thể làm bao gồm xác định CFAutorelease.

+0

Cảm ơn bạn, hãy trả lời câu trả lời! – Cyprian

Các vấn đề liên quan