6

Tôi muốn sử dụng CFStreamCreatePairWithSocketToHost với NSInput - và OutputStream s. Tôi có hai ivars NSInputStream *_inputStreamNSOutputStream *_outputStream.Truyền con trỏ gián tiếp tới con trỏ Mục tiêu-C đến 'CFReadStreamRef *' không được phép với ARC

Sau đây mang lại cho tôi hai thông báo lỗi:

CFStreamCreatePairWithSocketToHost(NULL, 
    (__bridge_retained CFStringRef)self.hostname, self.port, 
    (CFReadStreamRef *)&_inputStream, (CFWriteStreamRef *)&_outputStream); 

error: cast of an indirect pointer to an Objective-C pointer to ' CFReadStreamRef * ' (aka ' struct __CFReadStream ** ') is disallowed with ARC
error: cast of an indirect pointer to an Objective-C pointer to ' CFWriteStreamRef * ' (aka ' struct __CFWriteStream ** ') is disallowed with ARC

Làm thế nào tôi sẽ sửa lỗi này? Tôi đã thử sử dụng __bridge nhưng tôi nhận được thông báo lỗi tương tự.

Trả lời

4

Chuyển con trỏ đến các biến số CFReadStreamRefCFWriteStreamRef thực tế, sau đó truyền khi gán cho NSTypes của bạn. Về cơ bản:

CFThingRef cfThing = NULL; 
CFFunctionGetThing(&cfThing); 
NSThing * nsThing = cfThing; 

Tất nhiên, bạn sẽ có thêm các diễn viên cầu phù hợp và làm tất cả ops tính tham khảo thích hợp cho cfThing.

+0

Đây có phải là cách duy nhất để thực hiện việc này không? –

+0

@WTP Không chắc chắn - Tôi đã không dành nhiều thời gian với ARC cho đến nay. Quấn nó đi! :) – justin

+0

@WTP: Đừng quên rằng hàm sẽ zap nội dung trước đó của _inputStream và _outputStream với CRStreamRefs mới của riêng nó, vì vậy bạn cũng có thể làm cho chúng trở thành CFStreamRefs. – JeremyP

0

Hãy suy nghĩ về những gì ARC đang làm và những gì __bridge thực hiện: ARC chịu trách nhiệm giữ lại/giải phóng NSObject. __bridge chuyển giao trách nhiệm đó. Ví dụ, __bridge_retained giữ lại một NSString, đưa con trỏ tới CFStringRef, và giao trách nhiệm thực hiện thao tác phát hành khớp với bất kỳ ai sử dụng CFStringRef.

Điều đó không thể hoạt động với con trỏ tới NSObject * hoặc con trỏ tới tham chiếu Foundation Foundation. Một con trỏ trỏ đến một vị trí bộ nhớ. Bất kỳ loại đối tượng NSObject * hoặc Core Foundation nào đều có thể được lưu trữ ở đó.

Bạn cần hai biến, một cho NSInputStream * và một cho CFReadStreamRef. Sử dụng các cầu nối thích hợp để di chuyển NSInputStream * sang CFReadStreamRef. Bây giờ bạn có những gì bạn muốn, và có thể vượt qua địa chỉ trên.

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