2010-06-25 86 views
2

我正在泄漏 returnData = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:nil error:nil];在[NSURLConnection sendSynchronousRequest:theRequest returningResponse:nil error:nil]中发生泄漏漏洞

下面是我使用

NSString* curl = @"https://Some Url?ticket="; 
curl = [curl stringByAppendingString:self.ticket]; 
curl = [curl stringByAppendingString:@"&apikey=hjgajgfjaghjf&XMLString="]; 
curl = [curl stringByAppendingString:stringB]; 
curl = [curl stringByReplacingOccurrencesOfString:@"\n" withString:@""]; 
NSURL *finalURL = [NSURL URLWithString:curl]; 

    NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:finalURL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10]; 
    [theRequest setHTTPMethod:@"POST"]; 

    NSData* returnData= [NSURLConnection sendSynchronousRequest:theRequest returningResponse:nil error:nil]; 

任何一个可以告诉我,为什么我得到的泄漏returndata我relased的returndata并尝试过,但还是我收到的代码。

谢谢你

回答

9

从你发布的代码,没有泄漏。当你最终返回returnData时,调用者可能会保留它并忘记释放它,但是你提供的代码片段中的所有对象都是自动释放的,并且会在当前runloop结束时释放。

几件事我能想到的:

  1. 你也许在后台线程中运行这个(通过performSelectorInBackground:withObject:或有明确的NSThread分配)和遗忘创建和后来漏的NSAutoreleasePool围绕代码?

  2. 您可能会将内存绑在NSURLConnection的缓存中。你没有提到什么会导致你认为returnData被泄漏,但是如果它只是这个区域的内存损失(而不是泄漏仪器专门标记returnData对象),那么你可以通过清除喜欢的东西[[NSURLCache sharedURLCache] removeAllCachedResponses];

  3. 虽然不涉及任何真正的泄漏有NSURLConnection的缓存明确,这将是稍微更有效地建立使用NSString-stringWithFormat:而不是多次打电话给你-stringByAppendingString: URL字符串。同样,所有东西都是自动释放的,所以在字符串处理中没有泄漏,但是在下一次NSAutoreleasePool耗尽之前,您会创建更少的临时对象并减少峰值内存使用量。

我想找一个解决方案的头号位置将在此代码的调用者。赔率非常好,它保留了此方法的返回值,并且在某些时候没有正确释放它。它也可以将返回分配给一个保留的@property而不是最终将该属性清零-dealloc仪器会告诉您泄漏内存的位置是首次分配的,但它无法知道泄漏实际发生的位置 - 何时包含指针的最后一个变量被覆盖或超出范围。

如果您还没有,请尝试使用Xcode的构建和分析功能编译您的代码。通过该功能运行的CLANG静态分析仪通常可以计算出您的上一次参考丢失的位置,而不是仪器中的运行时动态分析。

祝你好运,跟踪下来!泄漏是从来没有乐趣....

1

我有问题的相反。我无法清除缓存。所以这就是我所做的:我添加了另一对,这将永远是不同的,使URL总是有点不同。我说:

[...] 

curl = [curl stringByAppendingString:@"&hello=hello"]; 

curl = [curl stringByAppendingString:nowStr]; 

where nowStr: 

NSDate *now = [NSDate date]; 

NSString * nowStr = [NSString stringWithFormat:@"%@", now]; 

nowStr = [nowStr stringByReplacingOccurancesOfString:@" " withString:@""]; 

nowStr = [nowStr stringByReplacingOccurancesOfString:@"+" withString:@""]; 

我相信我应该用什么做的一个随机数,也许我会在后面做。