【问题标题】:Why is the Xcode Analyzer given me a memory leak warning with this code?为什么 Xcode Analyzer 给我这个代码的内存泄漏警告?
【发布时间】:2013-06-13 21:03:14
【问题描述】:

警告是:

存储到 '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];
    }
}

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 我是否有理由不使用 __bridge_transfer?
    • 我会使用 __bridge_transfer 而不是手动处理保留。
    • @EthanAllen:你也可以使用 CFBridgingRelease() 宏,它使用了 __bridge_transfer,但是让“释放”更加明显。
    猜你喜欢
    • 2011-10-21
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    相关资源
    最近更新 更多