【问题标题】:NSURLConnection LeakNSURLConnection 泄漏
【发布时间】:2012-07-24 06:52:21
【问题描述】:

今天我遇到了一个小问题,我想知道泄漏的原因。这是代码

[[NSURLConnection alloc] initWithRequest:request delegate:self];

这没问题。

现在我只是想知道这个分配的内存/对象会发生什么,因为没有人释放它。所以根据本能,我在分配时放了自动释放:

[[[[NSURLConnection alloc] initWithRequest:request delegate:self] autorelease];

这给我带来了一个错误并崩溃了“[NSURLConnectionInternalConnection _withConnectionDisconnectFromConnection]: message sent to deallocated instance”

只是想知道背后的概念和原因。

编辑:我没有使用 ARC。

谢谢。

【问题讨论】:

标签: iphone objective-c


【解决方案1】:

我认为你不能在这里使用自动释放来更好地管理内存请在连接委托方法中释放连接对象

 - (void)connectionDidFinishLoading:(NSURLConnection *)connection;
 {
     [connection release];
 }

所以当你的连接完成时,它将释放连接对象,或者你也可以在 viewDidUnload 中释放它

【讨论】:

  • 这是否意味着我为连接所涂的内存与“connectionDidFinishLoading”中的此连接对象相同。谢谢
【解决方案2】:

[NSURLConnectionInternalConnection _withConnectionDisconnectFromConnection]

这是在自动释放池释放您的 NSURLConnection 连接对象后调用的。 最好的方法应该是,在完成获取数据后,对变量进行引用并释放它。 (可能在viewDidUnload:?)

【讨论】:

  • 嗨,我已经实施了你的解决方案,是的,它可以工作。我只是想知道后台发生了什么,就像您指出自动释放池之前释放了我的对象一样。那么我怎么知道在其他地方使用之前可能会调用或释放我的对象。我对这种情况概念有点困惑。谢谢
  • 看,基本上一个对象是堆上的一个内存位置。指向它的变量就像它的所有者。想象一条狗作为记忆,你是一个变量,用一条皮带牵着那条狗。现在,如果我是另一个指向同一内存位置的变量,想象一下我也用自己的皮带牵着狗。
  • 现在当你释放我时,意味着我正在从狗身上取下皮带。但你还是抱着它,当你也释放记忆或狗时,狗会跑掉。什么时候,我们可能无法准确判断。与自动释放池的工作方式相同,它会寻找这些狗,即内存位置并最终释放它们。
【解决方案3】:

您可以使用此方法进行更好的内存管理 NSURLConnection *connection=[NSURLConnection connectionWithRequest:urlRequest delegate:self];

上面的connectionWithRequest方法是类方法,它自己管理内存,你不需要释放它。 据我所知,在分配连接对象 objc 运行时将对象添加到 autoreleasepool 然后将其他委托方法发送到释放的实例。

【讨论】:

    猜你喜欢
    • 2010-11-23
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2011-09-07
    • 2011-03-21
    相关资源
    最近更新 更多