0

为什么我在使用 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]];
4

3 回答 3

4

过渡到 ARC 发行说明

__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));
于 2012-11-21T06:25:29.653 回答
2

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

你可以试试看,

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

更新: 如果您使用的是 ARC,您还可以__bridge_transfer用于将所有权从 created 转移CFObjectsNSObjects. 您只需将其用作NSString *encodeEmail = (__bridge_transfer NSString *)...

于 2012-11-21T06:24:01.057 回答
1

因为你会泄漏一个对象。具体来说,CFString方法返回的CFURLCreateStringByAddingPercentEscapes那个方法,包括关键字“create”,返回一个保留项。您必须手动释放它,或者告诉 ARC 使用以下命令为您处理它:

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

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

于 2012-11-21T06:26:11.257 回答