purgeIdleCellConnections

时间:2012-11-22 20:24:45

标签: ios

关于此问题的“重复”状态:
这个问题在2012年11月被问到,它包含问题的详细描述并有3个答案 2013年2月(在此“重复”之后3个月)提出了被称为“原始”的问题,没有详细说明,只有2个答案。这两个答案中最好的只是一个链接答案。


为什么我在控制台中收到此消息?

purgeIdleCellConnections: found one to purge conn = (some object-ID)

当我的应用程序启动时,我向服务器发送消息。我用这行代码做到了这一点:

@implementation AppStatus {
    NSMutableData*   activeDownload;
    NSURLConnection* Connection;
}

- (id) init {
    self = [super init];
    if (self) {
        activeDownload = nil;
        Connection     = nil;
    }
    return self;
}

- (void)sendStatus:(NSString*)url {
    NSString* escaped = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSURLConnection* conn =[[NSURLConnection alloc] initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:escaped]] delegate:self];
    Connection = conn;
    NSLog(@"%s Connection=%@",__PRETTY_FUNCTION__,Connection);
}

在同一个文件中,我有这个委托方法:

- (void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)data {
    NSLog(@"%s connection=%@",__PRETTY_FUNCTION__,connection);
    [activeDownload appendData:data];
}

- (void)connection:(NSURLConnection*)connection didFailWithError:(NSError*)error {
    NSLog(@"%s connection=%@",__PRETTY_FUNCTION__,connection);
    activeDownload = nil;
    Connection = nil;
    //do nothing else; just ignore the error
}

- (void)connectionDidFinishLoading:(NSURLConnection*)connection {
    NSLog(@"%s Connection=%@",__PRETTY_FUNCTION__,Connection);
    NSString* answer = [[NSString alloc] initWithData:activeDownload encoding:NSUTF8StringEncoding];
    //do something usefull with the server's answer
    activeDownload = nil;
    Connection = nil;
}

当我在真实设备上运行此应用程序(而不是在模拟器上)时,我在控制台中收到此消息:

2012-11-22 20:41:51.309 BookMan[376:907] -[AppStatus sendStatus:] Connection=<NSURLConnection: 0x1dd7ff40>
2012-11-22 20:41:51.929 BookMan[376:907] -[AppStatus connection:didReceiveData:] Connection=<NSURLConnection: 0x1dd7ff40>
2012-11-22 20:41:51.935 BookMan[376:907] -[AppStatus connectionDidFinishLoading:] Connection=<NSURLConnection: 0x1dd7ff40>
purgeIdleCellConnections: found one to purge conn = 0x1dd8ff60

purgeIdleCellConnections消息在connectionDidFinishLoading-message之后大约4或5秒出现。

正如您所看到的,purgeIdleCellConnections消息的对象编号与我在我的应用程序中创建和使用的连接编号不同。

也许重要提示:只有在真实设备(带有iOS 6.0.1的iPhone 4)上运行应用程序时才会收到此消息。此设备使用3G连接,而不是WIFI连接。目前我没有WIFI网络来测试这是否也发生在WIFI连接上 当我在模拟器上运行App时,我没有收到此消息。

当我将方法sendStatus改为:

- (void)sendStatus:(NSString*)url {
    NSString* escaped = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    //NSURLConnection* conn =[[NSURLConnection alloc] initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:escaped]] delegate:self];
    //Connection = conn;
    NSLog(@"%s Connection=%@",__PRETTY_FUNCTION__,Connection);
}

我在控制台中输出了这个输出:

2012-11-22 20:45:11.927 BookMan[391:907] -[AppStatus sendStatus:] Connection=(null)

当我不创建连接时,我没有收到purgeIdleCellConnections消息。


那么这条消息是什么意思,为什么我会得到它?:

purgeIdleCellConnections: found one to purge conn = (some object-ID)

3 个答案:

答案 0 :(得分:10)

这意味着,空闲时间过长的连接已关闭TCP连接。这是一个基本机制,它的日志不应该像Apple在Technical QA1774上所说的那样烦恼,它是一个错误地被启用的调试消息。

实际上,只有在清除 WWAN连接时才会显示此日志。

答案 1 :(得分:7)

是的,操作系统通过蜂窝数据关闭活动连接,即仅限3G。您不应该使用Wifi连接看到这一点。似乎操作系统清除连接会增加一些时间来向服务器发送数据请求。

答案 2 :(得分:0)

当连接到蜂窝网络的设备上时,我观察到这个调试消息来自iOS 6.0 SDK。时间方面,我发现它与我的应用程序中终止的“活动”AJAX调用相关。然而,要证明任何事情是非常困难的,因为只有在UIWebView中呈现网页时才会出现这种情况。我只是说我不认为这些信息是良性的。我认为它们可能表明Apple框架中的一个错误,它在终止连接方面过于激进。很难在UIWebView中运行的javascript上进行AJAX调用,因此目前它都是高度推测的。