我想做一个简单的TCP客户端。但我有一个错误。当我制作inputStream = (NSInputStream *)readStream;
和outputStream = (NSOutputStream *)writeStream;
时,它建议我引入前缀__bridge或_bridge_transfer。
首先,它是什么?其次,我两次都试过了,但仍然无法发送消息。我遵循了这个教程,我也有发送消息和流。我安装了Wireshark,并调用了send消息,但它没有向ip发送任何数据包。
我刚刚在这里发布了initNetworkCommunication,因为这是我得到"桥接"错误的地方。
- (void) initNetworkCommunication {
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"54.xxx.xxx.xxx", 1333, &readStream, &writeStream);
inputStream = (NSInputStream *)readStream;
outputStream = (NSOutputStream *)writeStream;
[inputStream setDelegate:self];
[outputStream setDelegate:self];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[inputStream open];
[outputStream open];
}
服务器很好,因为我已经尝试了示例代码,并且得到了响应。
你能帮我吗?
正如H2CO3所提到的,这是一个ARC。
如果你不知道ARC是什么,请阅读本文。总之,这是一种确定性的方法,可以自动执行Objective-C程序员以前必须手动执行的内存管理(保留/释放语句等)。它非常值得使用,而且几乎没有缺点。然而,它确实有一些问题。
ARC不适用于Core Foundation对象。它们仍然受旧规则的约束,你必须自己进行内存管理。ARC仅适用于Objective-C对象。然而,一些Core Foundation对象实际上是免费桥接到其Cocoa等价对象的。您在代码示例中使用免费桥接来创建CFReadStreamRef
,然后将其作为NSInputStream
使用。
那你是做什么的?苹果公司的文档显示:
如果在Objective-C和Core Foundation风格的对象之间进行强制转换,则需要使用强制转换(在objc/runtime.h中定义)或Core Foundation风格宏(在NSObject.h中定义
__bridge
在Objective-C和Core Foundation之间传递指针,而不传递所有权__bridge_retained
或CFBridgingRetain
将Objective-C指针强制转换为Core Foundation指针,并将所有权转移给您。您负责调用CFRelease或相关函数以放弃对象的所有权__bridge_transfer
或CFBridgingRelease
将非Objective-C指针移动到Objective-C,并将所有权转移到ARC。ARC负责放弃该对象的所有权
你正在从核心基础转向Objective-C,所以忽略第二个要点(这是朝着另一个方向发展的)。问题是你希望发生什么——如果在传输之后你想把对象交给ARC,只从Objective-C端使用它,并让ARC处理内存管理,那么就使用__bridge_transfer
。根据您的代码示例,这可能是您想要的。
如果您只使用__bridge
,或者不使用ARC,则需要使用CFRelease()
或向它们发送release
消息(后者仅在不使用ARC的情况下有效)来自行清除对象。