2012-09-05 36 views
9

thể trùng lặp:
How to make an CFArrayRef to an NSMutableArrayLàm thế nào để chuyển đổi CFArrayRef sang NSArray?

Tôi biết có rất nhiều thông tin về câu hỏi này, nhưng mỗi câu trả lời duy nhất là "đây là dễ dàng, bạn có thể làm diễn viên như cầu nối điện thoại miễn phí. ", và sau đó không có đề cập đến mã nguồn thực tế. Tôi biết giá trị trung bình của cầu nối và đúc miễn phí. Tôi muốn biết mã nguồn chính xác "Cách chuyển đổi CFArrayRef thành NSArray?" . Bất cứ ai vui lòng !!!!!!

Trả lời

5

Bạn sẽ có thể cast nó:

CFArrayRef *myLegacyArray = ... 

... 

NSArray *myArray=[(NSArray *)myLegacyArray copy]; 
+0

Cảm ơn bạn rất nhiều! Tôi sẽ cố gắng ngay bây giờ! – user1574429

+1

Bạn không cần phải sao chép nó. Một cây cầu miễn phí theo nghĩa đen chỉ là 'NSArray * myNsArray = (NSArray *) myCfArray; ' – jjv360

+0

Điều đó chỉ hoạt động đối với mã không phải ARC. –

37

Vâng, trước tiên bạn phải biết nếu bạn đang sử dụng ARC hay không, bởi vì các quy tắc thay đổi một chút. Tiếp theo, bạn cần phải biết những gì bạn thực sự muốn làm với dàn diễn viên của bạn. Bạn chỉ muốn sử dụng giá trị hoặc chuyển quyền sở hữu?

Tôi sẽ giả sử ARC, bởi vì, IMO, tất cả các mã mới thực sự nên sử dụng ARC (và ARC là nơi các vấn đề đúc phổ biến hơn).

CFArrayRef someArrayRef = ...; 
NSArray *array = (__bridge NSArray*)someArrayRef; 

Mã trên tham chiếu CF tham chiếu đến NSArray* có thể được sử dụng trong ngữ cảnh hiện tại. Không có chuyển quyền sở hữu đã diễn ra. someArrayRef vẫn giữ tham chiếu của nó và bạn vẫn phải tự giải phóng someArrayRef hoặc nó sẽ bị rò rỉ.

CFArrayRef someArrayRef = ...; 
NSArray *array = CFBridgingRelease(someArrayRef); 

Trong mã này, bạn không chỉ được truyền, mà còn chuyển quyền sở hữu. someArrayRef hiện không còn giữ tham chiếu nữa, do đó, nó không cần phải được giải phóng thủ công. Thay vào đó, khi phát hành array, đối tượng sẽ dealloc (giả sử không có tham chiếu khác ở những nơi khác).

+0

Hình như CFBridgingRelease là cách để đi trong môi trường ARC. Luôn chuyển sang NS ... và sử dụng CFBridgingRelease –

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