0

基になるを必要とするクラスメソッドがあり、CFSocketこのメソッドは頻繁に呼び出されるため、メソッドを実行するたびに新しいソケットを作成して破棄するにはコストがかかりすぎます。その代わりにstatic、CFSocketRefのインスタンスを作成して、メソッド呼び出し間で単一のソケットを共有できるようにしました。

+(void)myStaticMethod {
    static CFSocketRef udpSocket;

    @synchronized(self) {
        if (!udpSocket) {
            udpSocket = CFSocketCreate(kCFAllocatorDefault, PF_INET, SOCK_DGRAM, IPPROTO_UDP, 0, NULL, NULL);
            int yes = 1;
            setsockopt(CFSocketGetNative(udpSocket), SOL_SOCKET, SO_NOSIGPIPE, (void *)&yes, sizeof(yes));
        }
    }

    //method body
}

2つの質問があります:

  1. アプリが終了するときにソケットを破棄(無効化)することを心配する必要がありますか、それともそれ自体が閉じますか?
  2. ソケットがそれ自体を閉じる原因となる可能性のあるイベントはどれですか。また、不正な書き込みを防ぐにはどうすればよいCFSocketRefですか。
4

1 に答える 1

1

アプリが実際に終了すると、ソケットを含むすべてのリソースが解放されます。ただし、通常、アプリは終了せずにバックグラウンドに入ります。その場合、ソケットが無効になる可能性があります。これについては、テクニカル ノート TN2277で詳しく説明されています。特に「データ ソケット」のセクションを参照してください。

UDP ソケットの作成は単純な操作であるため、TN2277 からの次のアドバイスがコードに適用されます。

データ ソケットの再オープンが簡単で安価であり、ユーザーに目に見える結果がない場合、最善の方法は、アプリがバックグラウンドに移行したときにソケットを閉じ、フォアグラウンドに戻ったときにソケットを再オープンすることです。これにより、あなたの人生は非常にシンプルになります。実際、これを行うと、このセクションの残りの部分を完全に無視できます。

于 2012-09-17T11:28:54.077 に答える