为什么在使用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]];
答案 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
,它将消除您的警告。