gpt4 book ai didi

objective-c - GCDAsyncSocket 连接失败 - 仅当套接字变量被称为 "socket"时。怎么了?

转载 作者:行者123 更新时间:2023-12-03 16:41:36 31 4
gpt4 key购买 nike

我遇到了一个比任何事情都更让我困惑的问题。我正在尝试使用 GCDAsyncSocket 在 Objective-C 中建立套接字连接。当且仅当套接字变量名为 socket 时,发送到 GCDAsyncSocket 的 connectToHost 消息会失败并显示 EXC_BAD_ACCESS。确切地说,这不是一个问题,因为我很容易使用不同的变量名称,但我很好奇为什么会发生这种情况。

这是我认为是我的代码的相关部分,来 self 创建的名为 SocketManager 的类。大部分代码取自GCDAsyncSocket intro 。下面的代码在指定行失败并显示 EXC_BAD_ACCESS。

#import "SocketManager.h"
#import "GCDAsyncSocket.h"

@implementation SocketManager

GCDAsyncSocket *socket;

-(id) init {
self = [super init];

socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

NSError *err = nil;

// EXC_BAD_ACCESS happens at the line below
if (![socket connectToHost:@"localhost" onPort:26400 error:&err]) NSLog(@"I goofed: %@", err);

NSLog(@"just created socket");

return self;
}

但是,如果我将变量名称从 socket 更改为 sockbanana 或任何其他名称,代码运行正常,哪种让我很奇怪。为什么会发生这种情况? socket 是某种保留的系统字吗?如果是这样的话,我希望代码根本无法编译,但我对 Objective-C 还很陌生。

顺便说一句,我的 didConnectToHost: 委托(delegate)方法很少被调用,我认为这是一个单独的问题,但据我所知,它可能是相关的。

最佳答案

正如 @bburn 所建议的,这是符号冲突。 GCDAsyncSocket 使用了一个 BSD socket() 函数。如果您在调试器中查看 EXC_BAD_ACCESS,您会发现尝试调用 socket() 时实际上失败了,因为它将函数地址解析为变量的地址。

除了重命名变量之外,您还可以执行以下操作(我认为即使您也重命名变量,执行其中一项操作也是一个好主意):

  1. 将变量声明为静态。这会将变量的范围限制在该文件中,以便 GCDAsyncSocket 不会意外解析它。无论如何,将其从全局命名空间中删除是个好主意。
  2. 将其设为私有(private)成员变量。

要将其更改为私有(private)成员变量,请更改以下内容:

@implementation Socketmanager
GCDAsyncSocket *socket;

对此:

@interface SocketManager()
{
GCDAsyncSocket *socket;
}
@end

@implementation SocketManager
...

关于objective-c - GCDAsyncSocket 连接失败 - 仅当套接字变量被称为 "socket"时。怎么了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17976980/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com