1

警告是:

存储到“转义值”中的对象的潜在泄漏

这是代码:

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

1 回答 1

5

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

__bridge_transfer 告诉 ARC 在强制转换期间,对象上的 +1 保留计数被转移到 ARC 的责任之下。ARC 将根据其规则释放实例。

__bridge 告诉 ARC 在强制转换期间不会转移保留计数。

于 2013-06-13T21:21:29.477 回答