Objective-C:我该如何发布这个对象?

时间:2012-10-04 23:26:25

标签: objective-c

我有一个名为“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变量被覆盖了,而且我在适当的时候保留/释放的时候陷入了混乱。 / p>

所以我的工作只是每次想要与服务器通信时实例化ServerDataLayer。现在......在上面的例子中,我用'alloc'实例化请求,并设置'autorelease',因为我失去了第二个请求的范围。当NSURLConnection在内部执行请求时,第二个请求是否会留在内存中?

关于如何管理此类进程的对象引用,我现在有点迷失了。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

只需使用多个ServerDataLayer个实例。

答案 1 :(得分:1)

如果通过委托方法使用NSURLConnection,它将自身附加为运行循环的输入。但是它不会保留其代表。因此,您的ServerDataLayer将被取消分配(并且希望记住取消连接)。如果您对潜在的保留循环非常小心,可以使用对象关联为对象提供与URL连接相同的生命周期。

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

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

唯一需要注意的是,你不应该在你的initdealloc中使用点符号作为规则的特殊情况,即在一个只有一半的类上调用方法是不安全的实例化或半毁坏。