NSString,NSArray方法中的内存泄漏

时间:2012-08-21 09:12:34

标签: objective-c cocoa-touch memory-leaks

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

谢谢!

3 个答案:

答案 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说