1

警告は次のとおりです。

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

1 に答える 1

5

CFURLCreateStringByAddingPercentEscapes を呼び出すときに文字列を作成し、それを CFReleasing することはありません。オブジェクトがスコープ外になる前に CFRelease するか、__bridge を __bridge_transfer に変更して ARC に処理させます。

__bridge_transfer は、キャスト中にオブジェクトの +1 リテイン カウントが転送され、ARC の責任下にあることを ARC に伝えます。ARC はそのルールに従ってインスタンスを解放します。

__bridge は、キャスト中に保持カウントが転送されていないことを ARC に伝えます。

于 2013-06-13T21:21:29.477 に答える