11

この質問の「重複」状態について:
この質問は 2012 年 11 月に出されたもので、問題の詳細な説明が含まれており、3 つの回答があります。
「オリジナル」と呼ばれる質問は、2013 年 2 月 (この「重複」の 3 か月後) に出されたもので、詳細な説明はなく、回答は 2 つしかありません。その 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 メッセージのオブジェクト番号は、アプリで作成して使用した接続の番号と同じではありません。

おそらく重要: このメッセージは、実際のデバイス (iOS 6.0.1 を搭載した iPhone 4) でアプリを実行した場合にのみ表示されます。このデバイスは、WIFI 接続ではなく、3G 接続を使用します。現時点では、これが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

はい、これはOSがセルラーデータ経由のアクティブな接続を閉じている、つまり3Gのみです。これは、Wifi 接続を使用している場合には表示されません。接続をパージする OS が、データ要求をサーバーに送信するのに少し時間がかかるようです。

于 2012-12-23T23:52:53.037 に答える
0

セルラー ネットワークに接続されたデバイスで、iOS 6.0 SDK からこのデバッグ メッセージが出力されるのを確認しました。タイミング的には、アプリで終了する「アクティブな」AJAX 呼び出しに相関していることがわかります。ただし、これは UIWebView で Web ページをレンダリングするときにのみ発生するため、何かを証明することは非常に困難です。メッセージが無害だとは思わない、と言っているだけです。接続の終了に過度に積極的な Apple フレームワークのバグを示している可能性があると思います。AJAX 呼び出しを行う UIWebView 内で実行されている JavaScript のインストルメンテーションを取得するのは難しいため、現時点ではすべて非常に投機的です。

于 2012-11-23T13:47:47.013 に答える