潜在的内存泄漏编码网址

时间:2012-11-21 06:18:34

标签: objective-c ios

为什么在使用XCode进行分析时会出现内存泄漏?

NSString *email = [defaults objectForKey:@"email"];
NSString *encodeEmail = (__bridge NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)email, NULL, CFSTR(":/?#[]@!$ &'()*+,;=\"<>%{}|\\^~`"), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));


NSString *urlp1=@"/xyz/xx/";
NSString *fullUrl=[urlp1 stringByAppendingString: [NSString stringWithFormat:@"%@/following", encodeEmail]];

3 个答案:

答案 0 :(得分:4)

来自transitioning to ARC release notes

  

__ bridge在Objective-C和Core Foundation之间传输指针,不转让所有权。

这意味着encodeEmail没有分配内存的所有权,因此ARC不会发布它。

我认为你应该使用__bridge_transfer

  

__ bridge_transfer或CFBridgingRelease将非Objective-C指针移动到Objective-C,并将所有权转移到ARC。 ARC负责   放弃对象的所有权。

NSString *encodeEmail = (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)email, NULL, CFSTR(":/?#[]@!$ &'()*+,;=\"<>%{}|\\^~`"), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));

答案 1 :(得分:2)

您正在使用CFURLCreateStringByAddingPercentEscapes,因为您拥有它,所以必须发布它(检查名称中的“创建”)

你可以试试,

CFStringRef stringRef = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)email, NULL, CFSTR(":/?#[]@!$ &'()*+,;=\"<>%{}|\\^~`"), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));
encodeEmail = [NSString stringWithFormat:@"%@",(NSString *)stringRef];
CFRelease(stringRef);

<强>更新 如果您使用ARC,还可以使用__bridge_transfer将所有权从已创建的CFObjects转移到NSObjects。您只需将其用作NSString *encodeEmail = (__bridge_transfer NSString *)...

即可

答案 2 :(得分:1)

因为你会泄漏一个物体。具体而言,方法CFString返回的CFURLCreateStringByAddingPercentEscapes该方法(包括关键字“create”)将返回保留的项目。您必须手动释放它,或者告诉ARC使用以下方式处理它:

NSString *encodeEmail = (__bridge_transfer NSString*)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)email, NULL, CFSTR(":/?#[]@!$ &'()*+,;=\"<>%{}|\\^~`"), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));

请注意允许ARC为您处理内存管理的__bridge_transfer,它将消除您的警告。