Cocoa、免费桥接和ARC



我想做一个简单的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_retainedCFBridgingRetain将Objective-C指针强制转换为Core Foundation指针,并将所有权转移给您。您负责调用CFRelease或相关函数以放弃对象的所有权
  • __bridge_transferCFBridgingRelease将非Objective-C指针移动到Objective-C,并将所有权转移到ARC。ARC负责放弃该对象的所有权

你正在从核心基础转向Objective-C,所以忽略第二个要点(这是朝着另一个方向发展的)。问题是你希望发生什么——如果在传输之后你想把对象交给ARC,只从Objective-C端使用它,并让ARC处理内存管理,那么就使用__bridge_transfer。根据您的代码示例,这可能是您想要的。

如果您只使用__bridge,或者不使用ARC,则需要使用CFRelease()或向它们发送release消息(后者仅在不使用ARC的情况下有效)来自行清除对象。

相关内容

  • 没有找到相关文章

最新更新