为什么Xcode Analyzer使用此代码给我一个内存泄漏警告?

时间:2013-06-13 21:03:15

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

警告是:

  

存储在'escaped_value'中的对象的潜在泄漏

以下是代码:

- (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];
    }
}

1 个答案:

答案 0 :(得分:5)

当您调用CFURLCreateStringByAddingPercentEscapes并且从不CFReleasing它时,您正在创建一个字符串。在对象超出范围之前CFRelease该对象或将__bridge更改为__bridge_transfer以让ARC处理它。

__ bridge_transfer告诉ARC,在演员阵容期间,对象的+1保留计数被转移到ARCs的责任范围内。 ARC将根据其规则发布实例。

__ bridge告诉ARC,在演员阵容期间没有传输保留计数。