2

我在 returnData= [NSURLConnection sendSynchronousRequest:theRequest returnedResponse: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];

任何人都可以告诉我为什么我在返回数据中出现泄漏,重新定义了返回数据并尝试了它,但我仍然得到了。

谢谢你

4

2 回答 2

9

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

我能想到的几点:

  1. 您是否可能在后台线程中运行它(通过 performSelectorInBackground:withObject: 或使用显式 NSThread 分配)并且忘记创建并稍后在代码周围耗尽 NSAutoreleasePool?

  2. 您可能在 NSURLConnection 的缓存中占用了内存。您没有提到导致您认为 returnData 泄漏的原因,但如果它只是该区域的内存丢失(与 Leaks Instrument 专门标记 returnData 对象相反),那么您可以通过清除来释放 RAM NSURLConnection 使用类似的东西显式缓存[[NSURLCache sharedURLCache] removeAllCachedResponses];

  3. NSString-stringWithFormat:虽然与那里的任何实际泄漏无关,但使用而不是多次调用来构建您的 URL 字符串会稍微更有效率-stringByAppendingString:。同样,所有内容都是自动释放的,因此在字符串处理中没有泄漏,但是您将创建更少的临时对象并在下一次 NSAutoreleasePool 耗尽之前减少峰值内存使用量。

我要寻找解决方案的第一个地方是该代码的调用者。很有可能它保留了这个方法的返回值并且在某些时候没有正确地释放它。它也可能将返回分配给保留@property而不是最终在-deallocInstruments 中将属性归零,这会告诉您首次分配泄漏内存的位置,但它无法知道泄漏实际发生的位置 - 当最后一次包含指针的变量被覆盖或超出范围。

如果您还没有,请尝试使用 Xcode 的 Build and Analyze 功能编译您的代码。由该函数运行的 CLANG 静态分析器通常可以比 Instruments 中的运行时动态分析更能找出您最后一个参考丢失的位置。

祝你好运!泄漏从来都不是一件有趣的事......

于 2010-07-03T20:36:33.693 回答
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:@""];

我确信我应该使用一些与随机数有关的东西,也许我稍后会这样做。

于 2012-07-09T13:36:47.887 回答