代码之家  ›  专栏  ›  技术社区  ›  TomH

NSURL连接泄漏-为什么?

  •  0
  • TomH  · 技术社区  · 15 年前

    NSURLConnection*连接是类的属性

    @property (nonatomic, retain) NSURLConnection *connection;
    

    Instruments报告我在下面代码的第二行泄漏了一个NSURLConnection对象。

    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:_url];
    self.connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    [request release];
    

    didFinishLoading didFinishWithError 代理选择器,我正在释放连接并将其设置为零

    [self.connection release];
    self.connection = nil;
    

    我读过这本书 "NSURLConnection leak?" 波斯特和其他几个人。我觉得我肯定错过了一些显而易见的东西。帮忙?

    1 回复  |  直到 7 年前
        1
  •  3
  •   James Wald    15 年前

    正如roe的评论所说,您正在分配连接(保留计数1),然后使用连接属性(保留计数2)再次保留连接。您只能在代理选择器中释放一次。您有两个选择:

    1) 将连接属性更改为“分配”而不是“保留”。

    @property (nonatomic, assign) NSURLConnection *connection;
    
    // OR, since assign is the default you may omit it
    
    @property (nonatomic) NSURLConnection *connection;
    

    2) 在连接属性保留分配的对象后释放该对象:

    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:_url];
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    self.connection = connection;
    [connection release];
    [request release];
    

    由于alloc和release尽可能靠近,因此泄漏的可能性较小,因此首选选项2。此外,如果您忘记释放上一个连接,那么合成方法将为您释放上一个连接。不要忘记在dealloc中释放self.connection。