与ARC一起使用C API时的EXC_BAD_ACCESS

时间:2012-12-06 04:58:08

标签: objective-c ios automatic-ref-counting

我使用以下代码在使用Bonjour连接到主机时查找服务器主机名(使用<netinet/in.h>中的函数 和我的iOS Objective-C代码中的<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];
}

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

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

0 个答案:

没有答案