Ios 从类方法赋值将绑定类而不是其返回值

Ios 从类方法赋值将绑定类而不是其返回值,ios,objective-c,return-value,class-method,toll-free-bridging,Ios,Objective C,Return Value,Class Method,Toll Free Bridging,我注意到我正在编写的代码中有一些奇怪的行为,我想我会在这里询问,看看我是否在做一些愚蠢的事情,从而导致这种情况的发生 基本上,当我将一个变量赋给我的类方法的返回值时,它不是持有对返回值的引用的变量,而是持有对类的引用。请参阅下面的代码: NSArray * newAddresses = [MyHost addressesForHostname: @"google.com"]; 其方法签名为 + (NSArray *) addressesForHostname: (NSString *)host

我注意到我正在编写的代码中有一些奇怪的行为,我想我会在这里询问,看看我是否在做一些愚蠢的事情,从而导致这种情况的发生

基本上,当我将一个变量赋给我的类方法的返回值时,它不是持有对返回值的引用的变量,而是持有对类的引用。请参阅下面的代码:

NSArray * newAddresses = [MyHost addressesForHostname: @"google.com"];
其方法签名为

+ (NSArray *) addressesForHostname: (NSString *)hostname
返回

return (__bridge_transfer NSArray *) ipAddresses; // ipAddresses is a CFMutableArrayRef
如您所见,我正在使用免费桥接来使用CoreFoundation对象,因为我正在收集一些网络接口的IP地址列表

newAddresses
被分配到之后,我查看LLDB中
newAddresses
数组的类,得到:

(lldb)po[新地址类]
我的主人

我对如何使用
\uu桥接\uu传输的假设是否有误?用于构成
ipaddress
的所有对象都是
CFStringRefs

编辑:我被要求提供整个方法,所以就在这里

+ (NSArray *) addressesForHostname: (NSString *)hostname {

    CFMutableArrayRef ipAddresses;

    DLog(@"Getting addresses for host name %@", hostname);

    CFHostRef hostRef = CFHostCreateWithName(kCFAllocatorDefault, (__bridge CFStringRef)(hostname));
    CFStreamError error;

    BOOL didResolve = CFHostStartInfoResolution(hostRef, kCFHostNames, &error); // synchronously get the host.

    if (didResolve) {

        CFArrayRef responseObjects = CFHostGetAddressing(hostRef, NULL);
        long numberOfResponses = CFArrayGetCount(responseObjects);
        ipAddresses = CFArrayCreateMutable(kCFAllocatorDefault, numberOfResponses, &kCFTypeArrayCallBacks);

        for ( int i = 0 ; i < numberOfResponses; ++i ) {

            char * ipAddress;
            CFDataRef responseObject = CFArrayGetValueAtIndex(responseObjects, i);
            struct sockaddr * currentAddress = (struct sockaddr *) CFDataGetBytePtr(responseObject); // Unwrap the CFData wrapper aound the sockaddr struct

            switch (currentAddress->sa_family) {

                case AF_INET: { // Internetworking AKA IPV4

                    DLog(@"Extracting IPV4 address");
                    struct sockaddr_in * socketAddress = (struct sockaddr_in *) currentAddress;

                    ipAddress = malloc(sizeof(INET_ADDRSTRLEN));
                    inet_ntop(AF_INET,
                              &(socketAddress->sin_addr),
                              ipAddress,
                              INET_ADDRSTRLEN);

                    CFStringRef ipAddressString = CFStringCreateWithCString(kCFAllocatorDefault, ipAddress, kCFStringEncodingASCII);
                    CFArrayInsertValueAtIndex(ipAddresses, i, ipAddressString);

                    free(ipAddress);
                    break;

                }

                case AF_INET6: { // IPV6

                    DLog(@"Extracting IPV6 address");
                    struct sockaddr_in6 * socketAddress = (struct sockaddr_in6 *) currentAddress;

                    ipAddress = malloc(sizeof(INET6_ADDRSTRLEN));
                    inet_ntop(AF_INET6,
                              &(socketAddress->sin6_addr),
                              ipAddress,
                              INET6_ADDRSTRLEN);

                    CFStringRef ipAddressString = CFStringCreateWithCString(kCFAllocatorDefault, ipAddress, kCFStringEncodingASCII);
                    CFArrayInsertValueAtIndex(ipAddresses, i, ipAddressString);

                    free(ipAddress);
                    break;
                }

                default:
                    DLog(@"Unsupported addressing protocol encountered. Gracefully ignoring and continuing.");
                    break;
            }


        }

        CFRelease(responseObjects);

    }

    CFRelease(hostRef);

    return (__bridge_transfer NSArray *) ipAddresses;
}
+(NSArray*)地址主机名:(NSString*)主机名{
CFMutableArrayRef IP地址;
DLog(@“获取主机名%@的地址”,主机名);
CFHostRef hostRef=CFHostCreateWithName(kcfolocatordefault,(uu桥CFStringRef)(主机名));
cfr错误;
BOOL didrove=CFHostStartInfoResolution(hostRef,kCFHostNames,&error);//同步获取主机。
如果(didResolve){
CFArrayRef responseObjects=CFHostGetAddressing(hostRef,NULL);
long numberOfResponses=CFArrayGetCount(responseObjects);
IPAddresss=CFArrayCreateMutable(kCFAllocatorDefault、numberOfResponses和kCFTypeArrayCallBacks);
对于(int i=0;isa_系列){
案例AF_INET:{//Internetworking AKA IPV4
DLog(@“提取IPV4地址”);
*socketAddress=(struct sockaddr_in*)currentAddress中的struct sockaddr_;
ipAddress=malloc(sizeof(INET_ADDRSTRLEN));
inet_ntop(AF_inet,
&(socketAddress->sin_addr),
IP地址,
INET_ADDRSTRLEN);
CFStringRef ipAddressString=CFStringCreateWithCString(kCFAllocatorDefault,ipAddress,kCFStringEncodingASCII);
CFArrayInsertValueAtIndex(ipaddress,i,ipaddress字符串);
免费(IP地址);
打破
}
案例6:{//IPV6
DLog(@“提取IPV6地址”);
结构sockaddr_in6*socketAddress=(结构sockaddr_in6*)当前地址;
ipAddress=malloc(sizeof(INET6_ADDRSTRLEN));
inet_ntop(AF_INET6,
&(socketAddress->sin6_addr),
IP地址,
INET6_ADDRSTRLEN);
CFStringRef ipAddressString=CFStringCreateWithCString(kCFAllocatorDefault,ipAddress,kCFStringEncodingASCII);
CFArrayInsertValueAtIndex(ipaddress,i,ipaddress字符串);
免费(IP地址);
打破
}
违约:
DLog(@“遇到不支持的寻址协议。正常忽略并继续。”);
打破
}
}
CFRelease(响应对象);
}
CFRelease(hostRef);
返回(uu桥u传输协议*)IP地址;
}

所以我找到了解决方案,问题在于我忘记在任何事情发生之前初始化
ipaddress=nil
。按照编写此代码的方式,如果无法解析提供给
CFHostStartInfoResolution
hostRef
,则不会将值分配给
ipaddress
。如果
ipaddress
中没有值,它将返回一个未初始化的指针,该指针将被强制转换并转移其所有权

我找不到说明这一点的正式文档,但我相信这将是未定义的行为


我应该声明,如果有人使用此代码作为参考,我在发布
hostRef
的线路上遇到了不一致的崩溃。这与我为此线程创建的问题无关,但值得指出

所以我找到了解决方案,它在于我忘记在任何事情发生之前初始化
ipaddress=nil
。按照编写此代码的方式,如果无法解析提供给
CFHostStartInfoResolution
hostRef
,则不会将值分配给
ipaddress
。如果
ipaddress
中没有值,它将返回一个未初始化的指针,该指针将被强制转换并转移其所有权

我找不到说明这一点的正式文档,但我相信这将是未定义的行为


我应该声明,如果有人使用此代码作为参考,我在发布
hostRef
的线路上遇到了不一致的崩溃。这与我为此线程创建的问题无关,但值得指出

你能在方法中显示
ipaddress
的声明吗?或者更好的是,发布整个方法?看起来它实际上不是一个数组(CFMutableArrayRef)。也许它被意外地重新分配到了某个地方。好主意,本。我就这么做了。您将看到,在创建
ipaddress
之后,我并没有重新分配给它,我只是使用
CFArrayInsertValueAtIndex对它进行了变异<