0

我有一个名为“ServerDataLayer”的类,它包含一个 NSURLConnection 和一个 NSMutableData,它将接收到的 HTTP 数据写入其中。当连接完成时,它只是触发一个委托,我的调用者将自己作为引用传递,该方法如下所示:

-(void) serverDataLayerResponse:(id)entity
{
    if ([entity isMemberOfClass:[LoginResponse class]])
    {
        LoginResponse *response = (LoginResponse*)entity;

        NSLog(@"Error Code: %d", response.errorCode);
        NSLog(@"Error Message: %@", response.errorMessage);
        NSLog(@"Registered: %c", response.registered);
        NSLog(@"AuthToken: %@", response.authToken);

        [AppData shared].authToken = response.authToken;

        ServerDataLayer *request = [[[ServerDataLayer alloc] initWithServer:_serverUrl delegate:self] autorelease];
        [request getPlayerDetails];
        //[_server getPlayerDetails];
    }
}

这是我的问题...内部 _receivedData 和 _connection 变量当前正在使用中,而此委托方法正在进行中。我想使用我的同一个 ServerDataLayer 实例从“[_server getPlayerDetails]”触发另一个请求,但是内部的 _connection 和 _receivedData 变量被覆盖了,我陷入了关于何时在正确的时间保留/释放的混乱。

所以我的工作只是在每次我想与服务器交谈时实例化 ServerDataLayer。现在......在上面的示例中,我正在使用“alloc”实例化请求,并设置“autorelease”,因为我失去了第二个请求的范围。这第二个请求会在 NSURLConnection 忙于内部执行请求时保留在内存中吗?

在这一点上,我对如何管理此类过程的对象引用有点迷茫。任何帮助,将不胜感激。

4

2 回答 2

1

只需使用多个ServerDataLayer实例。

于 2012-10-04T23:50:10.677 回答
1

一个NSURLConnection, 如果通过委托方法使用,将把自己作为输入附加到运行循环。但是,它不会保留其代表。所以你ServerDataLayer会被释放(并希望记得取消连接)。如果您适当注意潜在的保留循环,您可以使用对象关联为您的对象提供与 URL 连接相同的生命周期。

如果你使用sendAsynchronousRequest:...那么你可能会没事的;假设您self在完成块中引用或任何实例变量,那么您将被该块保留并至少与它一样长。

真的没有必要再对保留/释放感到困惑了。即使 ARC 不是一个选项,您也可以将相关的实例变量声明为类扩展中的保留属性,并使用 self.property 表示法来设置新值。保留和释放将为您处理。

唯一需要注意的是,您永远不应该在您的initdealloc作为规则的特殊情况下使用点表示法,即在仅半实例化或半破坏的类上调用方法是不安全的。

于 2012-10-04T23:57:27.967 回答