【问题标题】:CFNetwork / NSURLConnection leakCFNetwork / NSURLConnection 泄漏
【发布时间】:2010-03-13 16:54:55
【问题描述】:

在设备上运行仪器时,我在 CFNetwork 中间歇性地导致恰好 3.5 KB 的内存泄漏,负责的帧是“HostLookup_Master::HostLookup....”

我已经阅读了许多关于这个问题的问题,并分别尝试了以下方法来修复泄漏:

  1. 在 applicationDidFinishLaunching 中包含以下内容:

    NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil]; [NSURLCache setSharedURLCache:sharedCache]; [sharedCache 发布];

  2. 在urlrequest中指定不从本地缓存加载。

以上都不起作用。我的实例化连接的类不会泄漏,因为它的实例在下载数据时被释放。我已经通过使用 Instruments 确认类的活动对象为 0 来验证这一点。

任何有关解决此泄漏的建议将不胜感激。

【问题讨论】:

  • 从技术上讲,如果主机查找被缓存,它不会泄漏,因为它仍然被引用并且可以重用。我的意思是,缓存代码中可能存在泄漏,它永远不会释放它。如果确实是泄漏,请向 Apple 提交 Radar 错误报告。
  • NSURLConnection 在最好的时候会泄漏。多线程时它会泄漏很多。我不会担心应用商店批准的微小泄漏。

标签: iphone objective-c cocoa-touch


【解决方案1】:

3.5kb 内存泄漏听起来很熟悉,在处理线程时是这样的:

@implementation MyClass
+ (void)login
{
    //MyClass *this = [[MyClass alloc] init]; // MEMORY LEAK
    MyClass *this = [[[MyClass alloc] init] autorelease];
    [NSThread detachNewThreadSelector:@selector(anotherThread)
                             toTarget:this
                           withObject:nil];
}

- (void)anotherThread {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    [self doStuff];
    //[self release]; // MEMORY LEAK
    [pool release];
}
@end

每次登录都会造成 3.5kb 泄漏。使用 autorelease 解决了这个问题

【讨论】:

  • 对我来说,你在做什么看起来有点尴尬,你为什么要做这个作业:MyClass *this = [[[MyClass alloc] init] autorelease]; “this”不是您通常在 Obj-C 中使用的。如果您不将其分配给 self,那么您泄漏内存是有道理的,这通常在 Obj-C 中使用。我也没有得到的是您将“this”声明为局部变量。如果从 +(void) 登录返回,则超出范围并且指针丢失。然后您在 [self release] 中所做的将是消息传递 nil ,它工作正常。然后,您将泄漏“this”变量。
  • @GorillaPatch login 是一个类方法,而不是一个实例方法,所以那里没有“self”被泄露。创建的对象恰好被称为“this”(恕我直言,这是一个糟糕的名称选择),它是调用 -(void)anotherThread 时的目标,因此它应该在那时被释放。
  • @Tony 好吧,我对“这个”感到困惑。对我来说,分离的线程获得 this 对象的所有权是有意义的,然后您可以在生成新线程后直接在 +login 方法中释放它。你怎么看?
  • @GorillaPatch 由于 NSThread 的文档说目标在新线程的执行期间被保留,那么是的,在生成线程后在 +login 中释放它是有意义的,而不是在选择器中.
  • 感谢@GorillaPatch 和@Tony 的代码审查!将变量重命名为 classObject 并在 +login 中将 autorelease 更改为 [release classObject]。
【解决方案2】:

似乎苹果可能知道与 CFNetwork 使用相关的 3.5k 泄漏,可能是reported as a bug already

【讨论】:

  • 向 Apple 提交错误有点像牺牲鸡。你不确定它是否有帮助,但它肯定不会造成任何伤害。 ;-)
  • 鸡可能对此有不同的看法。
猜你喜欢
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多