帮助!当我尝试获取给定主机名的地址时遇到了崩溃;崩溃日志显示如下:
1 libobjc.A.dylib 0x0000000197d180e4 objc_exception_throw + 56
2 核心基础 0x0000000186044218-[NSException initWithCoder:]
3 基础 0x0000000186e9528c -[NSThread 开始] + 136
4 ZFirewall7.dylib 0x0000000105e4d768 -[FiPSettingsManager doHostStuff:] + 1124
5 ZFirewall7.dylib 0x0000000105e48424 _ZL23my_CFHostCreateWithNamePPK13__CFAllocatorPPK10__CFString + 164
6 上传 0x000000010220d1c0 +[UploadUtil 地址ForHostname:] (UploadUtil.m:277)
7 上传 0x000000010220d120 +[UploadUtil addressForHostname:] (UploadUtil.m:267)
……
*** -[NSThread start]:尝试再次启动线程
我的代码是:
+(NSArray *)addressesForHostname:(NSString *)hostname
{
// Get the addresses for the given hostname.
CFHostRef hostRef = CFHostCreateWithName(kCFAllocatorDefault, (__bridge CFStringRef)hostname);
BOOL isSuccess = CFHostStartInfoResolution(hostRef, kCFHostAddresses, nil);
if (!isSuccess)
{
CFRelease(hostRef);
return nil;
}
CFArrayRef addressesRef = CFHostGetAddressing(hostRef, nil);
if (addressesRef == nil)
{
CFRelease(hostRef);
return nil;
}
// Convert these addresses into strings.
char ipAddress[INET6_ADDRSTRLEN];
NSMutableArray *addresses = [NSMutableArray array];
CFIndex numAddresses = CFArrayGetCount(addressesRef);
for (CFIndex currentIndex = 0; currentIndex < numAddresses; currentIndex++) {
struct sockaddr *address = (struct sockaddr *)CFDataGetBytePtr(CFArrayGetValueAtIndex(addressesRef, currentIndex));
if (address == nil)
{
CFRelease(hostRef);
return nil;
}
getnameinfo(address, address->sa_len, ipAddress, INET6_ADDRSTRLEN, nil, 0, NI_NUMERICHOST);
[addresses addObject:[NSString stringWithCString:ipAddress encoding:NSASCIIStringEncoding]];
}
CFRelease(hostRef);
return addresses;
}
这个函数确实由多个线程调用,CFHostCreateWithName 的文档说它是线程安全的,现在我不知道如何解决这个问题。