Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么Xcode分析器会用这段代码向我发出内存泄漏警告?_Ios_Objective C_Xcode_Automatic Ref Counting - Fatal编程技术网

Ios 为什么Xcode分析器会用这段代码向我发出内存泄漏警告?

Ios 为什么Xcode分析器会用这段代码向我发出内存泄漏警告?,ios,objective-c,xcode,automatic-ref-counting,Ios,Objective C,Xcode,Automatic Ref Counting,警告是: 存储在“转义值”中的对象可能泄漏 代码如下: - (NSURL*)generateURL:(NSString*)baseURL params:(NSDictionary*)params { if (params) { NSMutableArray* pairs = [NSMutableArray array]; for (NSString* key in params.keyEnumerator) { NSString*

警告是:

存储在“转义值”中的对象可能泄漏

代码如下:

- (NSURL*)generateURL:(NSString*)baseURL params:(NSDictionary*)params {
    if (params) {
        NSMutableArray* pairs = [NSMutableArray array];
        for (NSString* key in params.keyEnumerator) {
            NSString* value = params[key];
            NSString* escaped_value = (__bridge NSString *)CFURLCreateStringByAddingPercentEscapes(
                                                                                          NULL, /* allocator */
                                                                                          (__bridge CFStringRef)value,
                                                                                          NULL, /* charactersToLeaveUnescaped */
                                                                                          (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                                                                                          kCFStringEncodingUTF8);

            [pairs addObject:[NSString stringWithFormat:@"%@=%@", key, escaped_value]];
        }

        NSString* query = [pairs componentsJoinedByString:@"&"];
        NSString* url = [NSString stringWithFormat:@"%@?%@", baseURL, query];
        return [NSURL URLWithString:url];
    } else {
        return [NSURL URLWithString:baseURL];
    }
}

调用CFURLCreateStringByAddingPercentEscapes时,您正在创建一个字符串,并且从不释放它。要么在对象超出范围之前释放它,要么将_桥更改为_桥_传输,让ARC处理它

__bridge_transfer告诉ARC,在投射过程中,对象上的+1保留计数将被转移到ARC的责任范围内。ARC将根据其规则释放实例


__bridge告诉ARC在强制转换过程中未传输保留计数。

调用CFURLCreateStringByAddingPercentEscapes时,您正在创建一个字符串,并且从不释放它。要么在对象超出范围之前释放它,要么将_桥更改为_桥_传输,让ARC处理它

__bridge_transfer告诉ARC,在投射过程中,对象上的+1保留计数将被转移到ARC的责任范围内。ARC将根据其规则释放实例


__bridge告诉ARC在强制转换期间未传输保留计数。

有什么原因我不应该使用_bridge_transfer?我会使用_bridge_transfer,而不是手动处理保留。@Ethanalen:您也可以使用使用_bridge_transfer的CfBrigingRelease()宏,但要进行“释放”更明显。有什么原因我不应该使用uuuu bridge\u transfer吗?我会使用uuu bridge\u transfer,而不是手动处理retain。@Ethanalen:您也可以使用使用使用uuu bridge\u transfer的CfbrigingRelease()宏,但会使“释放”更明显。