iPhone内存泄漏?

4

有一个让我非常困扰的问题,希望您能帮忙解答。请问为什么这行代码会出现内存泄漏?

NSString *post = [NSString stringWithFormat:@"<someXML><tagWithVar=%@></tagWithVar></someXML>",var];
post = [NSString stringWithFormat:@"xmlValue=%@",(NSString *)CFURLCreateStringByAddingPercentEscapes(
                                                                               NULL,
                                                                               (CFStringRef)post,
                                                                               NULL,
                                                                               (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                                                                               kCFStringEncodingUTF8 )];

我只是将一个字符串编码为URL格式。据我所知,stringWithFormat:应该返回一个自动释放的对象。显然不是这种情况。它可以工作,但会泄漏内存。有什么想法吗?


FYI,这与Xcode无关,因此我重新标记了你的问题。 - Jonathan Sterling
1个回答

15

你正在使用CFURLCreateStringByAddingPercentEscapes方法。如果一个Core Foundation函数的名称中有"Create",那么它意味着你拥有返回的对象。换句话说,你需要释放由CFURLCreateStringByAddingPercentEscapes返回的CFStringRef

NSString *post = [NSString stringWithFormat:@"...", var];
CFStringRef stringRef = CFURLCreateStringByAddingPercentEscapes(...);
post = [NSString stringWithFormat:@"xmlValue=%@",(NSString *)stringRef];
CFRelease(stringRef);

只是因为你乐于重新标记问题。 :) - James Huddleston
看起来仍然会在某个时候自动释放。当我在设置好一切之后尝试调用 [post release]; 时,在调用僵尸对象时它会崩溃(明明已经手动释放了)。 - gabaum10
1
需要释放的不是 post ,而是由 CFURLCreateStringByAddingPercentEscapes 返回的 CFStringRef - James Huddleston
你能详细描述一下如何做吗?我尝试了,但还是有泄漏。我甚至尝试将CFStringRef提取到它自己的对象中:CFStringRef *tempRef。 - gabaum10
我已更新我的答案以包含代码。如果您仍然有问题,请告诉我。 - James Huddleston
太棒了。我想这就是解决的办法。我之前释放它的方式不正确。(我还在努力理解CF函数)。我将释放方式更改为CFRelease(stringRef); 这样问题就解决了。谢谢。 :) - gabaum10

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接