每次我调用此方法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。 每次我尝试使用它时为什么会发生这种泄漏?
谢谢!
答案 0 :(得分:3)
您不会释放entries
数组。
顺便说一句,此处不需要__block
修饰符,因为您不会在块内修改该变量。
答案 1 :(得分:1)
您在queryStringFromParameters:方法中分配/初始化NSArray。您返回的数组确实是一个自动释放的对象([entries componentsJoinedByString:@“&”])但您永远不会释放条目数组。
您可以替换
行NSMutableArray __block *entries = [[NSMutableArray alloc] init];
通过
NSMutableArray __block *entries = [NSMutableArray array];
解决问题。 字符串泄漏是因为它们保存在泄漏的NSArray中。
答案 2 :(得分: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);
同样删除__lock,因为@Martin R说