NSString,NSArray方法中的内存泄漏



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

方法如下:

+ (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。为什么每次我尝试使用它时都会发生这种泄漏?

谢谢!

您不会释放entries数组。

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

您在queryStringFromParameters:方法中分配/初始化NSArray。您返回的数组实际上是一个自动释放的对象([entries componentsJoinedByString:@"&"]),但您从未释放entries数组。

您可以更换线路

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

通过

NSMutableArray __block *entries = [NSMutableArray array];

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

在queryStringFromParameters方法中,我认为没有必要分配条目。只需使用自动参考阵列

  NSMutableArray *entries = [NSMutableArray array];

在第二个方法中,u使用了CFURLCreateStringByAddingPercentEscapes,该方法的第二个参数是u传递的(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);

也删除__block,因为@Martin R说

最新更新