【发布时间】:2015-12-28 06:50:41
【问题描述】:
我刚刚投入到 iOS 开发中,我目前在 queryServer 函数末尾的函数 CFRelease 中遇到运行时错误(我在 get 突出显示的行上添加了注释),但我没有如果我注释掉对 extractIPFromQuery 的函数调用,则会出现错误。
下面的代码获取服务器的名称并将 IP 地址列表返回到该服务器。
func extractIPFromQuery(query: NSArray) -> [String] {
var addresses = [String]()
for x in 0...query.count - 1{
let adr = "\(query[x])"
let adrStart = adr.startIndex.advancedBy(10)
let adrEnd = adr.startIndex.advancedBy(18)
let address = adr.substringWithRange(Range<String.Index>(start: adrStart, end: adrEnd))
var final = ""
// Convert the hex version of the address into
// a human readable version
for seg in 0...3{
let start = address.startIndex.advancedBy(seg * 2)
let end = address.startIndex.advancedBy((seg * 2) + 2)
let hexRange = Range<String.Index>(start: start, end: end)
let hexPair = address.substringWithRange(hexRange)
final += "\(UInt8(strtoul(hexPair, nil, 16)))"
if(seg != 3){
final += "."
}
}
addresses.append(final)
}
return addresses;
}
func queryServer(hostName: String) -> [String]{
var ips = [String]()
if hostName != "\0" {
let hostRef = CFHostCreateWithName(kCFAllocatorDefault, hostName).takeRetainedValue()
while(CFHostStartInfoResolution(hostRef, CFHostInfoType.Addresses, nil) == false){}
ips += extractIPFromQuery(CFHostGetAddressing(hostRef, nil)!.takeRetainedValue() as NSArray)
} // Code breaks here
return ips
}
【问题讨论】:
-
调用
queryServer时是否传递了有效的服务器名称? -
代码确实有效,ips 填充了一堆地址
-
由于离开
if范围时会崩溃,因此这意味着它与范围内使用的变量之一有关:hostRef或CFHostGetAddressing的结果。跨度> -
还可以查看stackoverflow.com/questions/25890533/…,了解使用
getnameinfo()将IP 地址转换为字符串的更简单方法。