以下是解析linphone的destroy方法,看看他做了什麼,效果會是什麼。
- (void)destroyLibLinphone {
// 1.
[mIterateTimer invalidate];
//just in case
// 2.
[self removeCTCallCenterCb];
// 3.
[[NSNotificationCenter defaultCenter] removeObserver:self];
//4.
if (theLinphoneCore != nil) { //just in case application terminate before linphone core initialization
[LinphoneLogger logc:LinphoneLoggerLog format:"Destroy linphonecore"];
linphone_core_destroy(theLinphoneCore);
theLinphoneCore = nil;
ms_exit(); // Uninitialize mediastreamer2
// Post event
NSDictionary *dict = [NSDictionary dictionaryWithObject:[NSValue valueWithPointer:theLinphoneCore] forKey:@"core"];
[[NSNotificationCenter defaultCenter] postNotificationName:kLinphoneCoreUpdate object:[LinphoneManager instance] userInfo:dict];
SCNetworkReachabilityUnscheduleFromRunLoop(proxyReachability, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
if (proxyReachability)
CFRelease(proxyReachability);
proxyReachability=nil;
}
//5.
libStarted = FALSE;
}
- 他將mIterateTimer這個NSTimer給停止,並從NSRunLoop內移除,這個timer會定時執行固定的背景工作,像是接收sip訊息、執行對proxy的註冊之類的。所以這主要是停止固定的背景任務。
- 他將CTCallCenter這個變數給釋放。這主要是處理電話的部分,可以取得目前的來電狀況,以及來電狀態的變化,像是來電的狀況從撥出到接通。
- 再來就只是將自己本身從通知中心移除。
- 這邊主要是把LinphoneCore給釋放。首先是呼叫linphonecoredestroy來清除theLinphoneCore,然後將theLinphoneCore釋放。再來post一個消息出來說Libphone core更新狀態了。最後是將對於某個網域(address或是name)的可連線能力的參考從目前的Run loop中移除,並且釋放它
- 最後把libStarted給設定成False。
留言
張貼留言