我的函数中的Objective-c内存泄漏

时间:2013-04-01 05:12:33

标签: objective-c memory-leaks

任何人都可以帮我找到以下函数中的内存泄漏

-(NSString *)urlEncodeUsingEncoding:(NSStringEncoding)encoding :(NSString *)string {
    return (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,  (CFStringRef)string,  NULL,  (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ",  CFStringConvertNSStringEncodingToEncoding(encoding));
}

仪器在上述功能的每次调用中报告内存泄漏。

2 个答案:

答案 0 :(得分:4)

当你拥有该对象时,

CFURLCreateStringByAddingPercentEscapes会增加+1保留计数。所以你有责任释放那个对象。所以你需要CFStringRef并在使用后使用CFRelease来释放它。

-(NSString *)urlEncodeUsingEncoding:(NSStringEncoding)encoding :(NSString *)string {
    CFStringRef stringRef = CFURLCreateStringByAddingPercentEscapes(NULL,  (CFStringRef)string,  NULL,  (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ",  CFStringConvertNSStringEncodingToEncoding(encoding));
    NSString *returnString = (NSString*)stringRef;
    CFRelease(stringRef);
    return returnString;
}

答案 1 :(得分:1)

解决方案取决于您是否使用ARC。

使用ARC,您可以转让所有权:

-(NSString *)urlEncodeUsingEncoding:(NSStringEncoding)encoding :(NSString *)string {
    return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,  (CFStringRef)string,  NULL,  (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ",  CFStringConvertNSStringEncodingToEncoding(encoding));
}

使用MRC,您可以:

-(NSString *)urlEncodeUsingEncoding:(NSStringEncoding)encoding :(NSString *)string {
    NSString *result = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,  (CFStringRef)string,  NULL,  (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ",  CFStringConvertNSStringEncodingToEncoding(encoding));

    return [result autorelease];
}