11

关于这个问题的“重复”状态:
这个问题是在 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 消息之后大约 4 或 5 秒出现。

如您所见,purgeIdleCellConnections-message 的对象编号与我在应用程序中创建和使用的连接编号不同。

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

当我将方法 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)
4

3 回答 3

10

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

实际上,此日志仅在清除WWAN 连接时显示。

于 2013-03-08T09:17:08.470 回答
7

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

于 2012-12-23T23:52:53.037 回答
0

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

于 2012-11-23T13:47:47.013 回答