关于此问题的“重复”状态:
这个问题在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)
答案 0 :(得分:10)
这意味着,空闲时间过长的连接已关闭TCP连接。这是一个基本机制,它的日志不应该像Apple在Technical QA1774上所说的那样烦恼,它是一个错误地被启用的调试消息。
实际上,只有在清除 WWAN连接时才会显示此日志。
答案 1 :(得分:7)
是的,操作系统通过蜂窝数据关闭活动连接,即仅限3G。您不应该使用Wifi连接看到这一点。似乎操作系统清除连接会增加一些时间来向服务器发送数据请求。
答案 2 :(得分:0)
当连接到蜂窝网络的设备上时,我观察到这个调试消息来自iOS 6.0 SDK。时间方面,我发现它与我的应用程序中终止的“活动”AJAX调用相关。然而,要证明任何事情是非常困难的,因为只有在UIWebView中呈现网页时才会出现这种情况。我只是说我不认为这些信息是良性的。我认为它们可能表明Apple框架中的一个错误,它在终止连接方面过于激进。很难在UIWebView中运行的javascript上进行AJAX调用,因此目前它都是高度推测的。