任何人都可以帮我找到以下函数中的内存泄漏
-(NSString *)urlEncodeUsingEncoding:(NSStringEncoding)encoding :(NSString *)string {
return (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)string, NULL, (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ", CFStringConvertNSStringEncodingToEncoding(encoding));
}
仪器在上述功能的每次调用中报告内存泄漏。
答案 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];
}