0

在我的 iOS Objective-C 代码中使用 Bonjour(使用<netinet/in.h> 和的函数)连接到主机时,我使用以下代码查找服务器主机名。<arpa/inet.h>我使用的代码(如下所示)来自 Big Nerd Ranch iOS 编程书籍,但最初编写时并未考虑到 ARC。

- (NSString *)serverHostName
{
    NSArray *addresses = [desktopServer addresses];
    NSData *firstAddress = [addresses objectAtIndex:0];

    // the binary data in the NSData object is a sockaddr_in (which represents a network host)
    const struct sockaddr_in *addy = [firstAddress bytes];

    // convert 4-byte IP address in network byte order to a C string of the format xxx.xxx.xxx.xxx
    char *ipAddress = inet_ntoa(addy->sin_addr);

    // convert the 2-byte port number from network to host byte order
    UInt16 port = ntohs(addy->sin_port);

    return [NSString stringWithFormat:@"%s:%u", ipAddress, port];
}

它偶尔会在线路上出现 EXC_BAD_ACCESS 崩溃,char *ipAddress = inet_ntoa(addy->sin_addr);让我相信它addy被处理得太早了。我已经尝试研究使用CFBridgingRetain()CFRetain()方法来防止这种情况,但它们要么没有任何区别,要么似乎引入了更多问题。

关于我应该寻找什么来消除这个问题的任何建议?

4

0 回答 0