2012-09-17 26 views
0

我有需要底層CFSocket一個類的方法,而這種方法被調用非常頻繁,因此太貴創建和每個方法運行時間摧毀一個新的套接字。所以不是我創建了一個CFSocketRef的static實例,這樣就可以共享一個插座之間的方法調用:哪些原因會導致CFSocket關閉本身?

+(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 
} 

我有兩個問題:

  1. 我必須擔心破壞(無效)應用程序終止時的套接字,還是關閉自己?
  2. 哪些事件可能會導致插座,關閉本身和你將如何阻止潛在的寫入壞CFSocketRef

回答

1

如果一個應用程序真正終止,那麼所有資源,包括插座,被釋放。但通常應用程序不會終止,但會進入後臺,在這種情況下套接字可能會失效。這在Technical Note TN2277中描述得非常好。特別參見「數據插口」部分。

因爲一個UDP套接字的創建是一個簡單的操作,從TN2277以下建議將適用於您的代碼:

如果重新打開數據插口簡單,價格便宜,而且沒有用戶 明顯的後果,最好的辦法是當 應用進入後臺關閉套接字,當它回來 到前臺重新打開它。這讓你的生活變得非常簡單。其實,如果你 做到這一點,你可以忽略這部分完全的休息!

相關問題