我有一个名为“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在内部执行请求时,第二个请求是否会留在内存中?
关于如何管理此类进程的对象引用,我现在有点迷失了。任何帮助将不胜感激。
答案 0 :(得分:1)
只需使用多个ServerDataLayer
个实例。
答案 1 :(得分:1)
如果通过委托方法使用NSURLConnection
,它将自身附加为运行循环的输入。但是它不会保留其代表。因此,您的ServerDataLayer
将被取消分配(并且希望记住取消连接)。如果您对潜在的保留循环非常小心,可以使用对象关联为对象提供与URL连接相同的生命周期。
如果你使用sendAsynchronousRequest:...
那么你可能会很好;假设您在完成块中引用self
或任何实例变量,那么您将被块保留并且至少与它一样长。
真的没有必要再把自己与保留/释放混淆了。即使ARC不是一个选项,您也可以将相关的实例变量声明为类扩展中的retain属性,并使用self.property表示法来设置新值。保留和释放将为您处理。
唯一需要注意的是,你不应该在你的init
或dealloc
中使用点符号作为规则的特殊情况,即在一个只有一半的类上调用方法是不安全的实例化或半毁坏。