Objective c Cocoa、免费桥接和ARC

Objective c Cocoa、免费桥接和ARC,objective-c,cocoa,stream,inputstream,tcpclient,Objective C,Cocoa,Stream,Inputstream,Tcpclient,我想做一个简单的TCP客户。但我有一个错误。当我将inputStream=(NSInputStream*)设为readStream时和outputStream=(NSOutputStream*)writeStream建议我引入前缀“桥”或“桥”转移 首先,它是什么?其次,我尝试了这两种方法,但仍然无法发送消息。我遵循这一点,我已经发送消息和流了。我安装了Wireshark,发送消息被调用,但它没有向ip发送任何数据包 我刚刚在这里发布了initNetworkCommunication,因为这是我

我想做一个简单的TCP客户。但我有一个错误。当我将
inputStream=(NSInputStream*)设为readStream时
outputStream=(NSOutputStream*)writeStream建议我引入前缀“桥”或“桥”转移

首先,它是什么?其次,我尝试了这两种方法,但仍然无法发送消息。我遵循这一点,我已经发送消息和流了。我安装了Wireshark,发送消息被调用,但它没有向ip发送任何数据包

我刚刚在这里发布了initNetworkCommunication,因为这是我得到“桥接”错误的地方

服务器很好,因为我已经尝试了示例代码,并得到了响应


你能帮帮我吗?

正如H2CO3所提到的,这是一种弧形的东西

如果你不知道什么是弧。总之,这是一种确定性的方法,可以自动化Objective-C程序员以前必须手动完成的内存管理工作(保留/释放语句等)。它非常值得使用,而且几乎没有缺点。然而,它确实有一些问题

弧对核心基础对象不起作用。它们仍然受旧规则的约束,您必须自己进行内存管理。圆弧仅适用于Objective-C对象。然而,一些核心基金会对象实际上是免费的桥接到他们的可可等价物。您正在代码示例中使用免费桥接,以创建

CFReadStreamRef
,然后将其作为
NSInputStream
使用

那你是做什么的?苹果的文档说:

如果在Objective-C和Core Foundation样式对象之间进行强制转换,则需要使用强制转换(在objc/runtime.h中定义)或Core Foundation样式宏(在NSObject.h中定义)告诉编译器对象的所有权语义:

    >代码>桥/<代码>在Objut-C与核心基础之间传递指针,不进行所有权转移。
  • 代码>桥接保持< <代码>或<代码> CFBridgingRetain < /代码>向核心基础指针抛出ObjuleC指针,并将所有权转移给您。 您负责调用CFRelease或相关函数以放弃对象的所有权
  • \uuuuuu bridge\u transfer
    cfbridgengrelease
    将非Objective-C指针移动到Objective-C,并将所有权转移到ARC。 ARC负责放弃对象的所有权
<>你正在从核心基础转移到Objto-C,因此忽略第二个子弹点(这是为了向另一个方向前进)。问题是您希望发生什么-如果在传输后您希望将该对象交给ARC,则仅从Objective-C端使用该对象,并让ARC处理内存管理,请使用
\uu bridge\u transfer
。根据您的代码示例,这可能就是您想要的


如果您只使用
\uuu桥
,或者不使用ARC,您需要自己清理对象,使用
CFRelease()
或者通过向对象发送
release
消息(后者仅在您不使用ARC的情况下有效)。

正如H2CO3所述,这是ARC的事情

如果你不知道什么是弧。总之,这是一种确定性的方法,可以自动化Objective-C程序员以前必须手动完成的内存管理工作(保留/释放语句等)。它非常值得使用,而且几乎没有缺点。然而,它确实有一些问题

弧对核心基础对象不起作用。它们仍然受旧规则的约束,您必须自己进行内存管理。圆弧仅适用于Objective-C对象。然而,一些核心基金会对象实际上是免费的桥接到他们的可可等价物。您正在代码示例中使用免费桥接,以创建

CFReadStreamRef
,然后将其作为
NSInputStream
使用

那你是做什么的?苹果的文档说:

如果在Objective-C和Core Foundation样式对象之间进行强制转换,则需要使用强制转换(在objc/runtime.h中定义)或Core Foundation样式宏(在NSObject.h中定义)告诉编译器对象的所有权语义:

    >代码>桥/<代码>在Objut-C与核心基础之间传递指针,不进行所有权转移。
  • 代码>桥接保持< <代码>或<代码> CFBridgingRetain < /代码>向核心基础指针抛出ObjuleC指针,并将所有权转移给您。 您负责调用CFRelease或相关函数以放弃对象的所有权
  • \uuuuuu bridge\u transfer
    cfbridgengrelease
    将非Objective-C指针移动到Objective-C,并将所有权转移到ARC。 ARC负责放弃对象的所有权
<>你正在从核心基础转移到Objto-C,因此忽略第二个子弹点(这是为了向另一个方向前进)。问题是您希望发生什么-如果在传输后您希望将该对象交给ARC,则仅从Objective-C端使用该对象,并让ARC处理内存管理,请使用
\uu bridge\u transfer
。根据您的代码示例,这可能就是您想要的


如果您只使用
\u桥
,或者不使用ARC,您需要自己清理对象,使用
CFRelease()
或发送
release
消息(后者仅在不使用ARC时有效)。

1。这些关键词都是愚蠢的弧相关的东西;你最好为这个项目关闭ARC。2.我已经围绕BSD套接字API创建了一个Objective-C TCP包装器,它非常易于使用:1。这些关键词都是愚蠢的弧相关的东西;你最好为这个项目关闭ARC。2.我已经围绕BSD套接字API创建了一个Objective-C TCP包装器,它非常易于使用:非常感谢Amy Worrall。嗯,我从simp来过
- (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];

}