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所有権を createdCFObjectsからに転送するためにも使用できますNSObjects。として使用するだけです。NSString *encodeEmail = (__bridge_transfer NSString *)...

于 2012-11-21T06:24:01.057 に答える
1

オブジェクトをリークするからです。具体的には、キーワード「create」を含むメソッドCFStringによって返されるメソッドは、保持されたアイテムを返します。CFURLCreateStringByAddingPercentEscapes手動で解放するか、次の方法で ARC に処理を指示する必要があります。

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

__bridge_transferARCがメモリ管理を処理できることに注意してください。これにより、警告がなくなります。

于 2012-11-21T06:26:11.257 に答える