0

每次我调用这个方法 2NSString和 1NSMutableArray对象泄漏,这很恶心,因为我在我的应用程序中经常使用它。

这是方法:

+ (NSString *)queryStringFromParameters:(NSDictionary *)parameters {
    NSMutableArray __block *entries = [[NSMutableArray alloc] init];

    [parameters enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        NSString *entry = [NSString stringWithFormat:@"%@=%@", [key pcen], [obj pcen]];
        [entries addObject:entry];
    }];
    return [entries componentsJoinedByString:@"&"];
}

这是[pcen]方法

- (NSString *)pcen {
    CFStringRef string = CFURLCreateStringByAddingPercentEscapes(NULL,
                                                                 (CFStringRef)self,
                                                                 NULL,
                                                                 CFSTR("!*'();:@&=+$,/?%#[]"),
                                                                 kCFStringEncodingUTF8);
    return [(NSString *)string autorelease];
}

它们在同一个文件中,我的项目是 ARC,但对于这个文件,我未选中 ARC。为什么每次我尝试使用它时都会发生这种泄漏?

谢谢!

4

3 回答 3

3

您不释放entries阵列。

顺便说一句,__block这里不需要修饰符,因为您不会在块内修改该变量。

于 2012-08-21T09:19:32.830 回答
1

您在 queryStringFromParameters: 方法中分配/初始化 NSArray。您返回的数组确实是一个自动释放的对象([entries componentsJoinedByString:@"&"]),但您永远不会释放条目数组。

你可以换行

NSMutableArray __block *entries = [[NSMutableArray alloc] init];

经过

NSMutableArray __block *entries = [NSMutableArray array];

解决问题。字符串泄漏是因为它们保存在泄漏的 NSArray 中。

于 2012-08-21T09:21:36.913 回答
0

在您的 queryStringFromParameters 方法中,我认为不需要分配条目。只需使用自动引用数组

  NSMutableArray *entries = [NSMutableArray array];

在第二种方法中,您使用了 CFURLCreateStringByAddingPercentEscapes,它在您传递 (CFStringRef)self 时具有第二个参数,但这应该是 OriginalString - 要复制的 CFString 对象。

CFURLCreateStringByAddingPercentEscapes 的示例如下:

CFStringRef originalURLString = CFSTR("http://online.store.com/storefront/?request=get-document&doi=10.1175%2F1520-0426(2005)014%3C1157:DODADSS%3E2.0.CO%3B2");

CFStringRef preprocessedString = CFURLCreateStringByReplacingPercentEscapesUsingEncoding(kCFAllocatorDefault, originalURLString, CFSTR(""), kCFStringEncodingUTF8);

也像@Martin R所说的那样删除__block

于 2012-08-21T09:25:04.760 回答