每次我调用这个方法时,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说