Android framework回顧 sp 和 wp sp對象,androidwp
用MediaPlayer說明sp的實現。sp是一個模板類,T是RefBase的子類。只要繼承於RefBase的類都可以使用sp。binder類也繼承RefBase類,binder的實現離不開RefBase。
用如下代碼說說我遇到的疑惑。
201 static sp<MediaPlayer> getMediaPlayer(JNIEnv* env, jobject thiz)
202 {
203 Mutex::Autolock l(sLock);
204 MediaPlayer* const p = (MediaPlayer*)env->GetIntField(thiz, fields.context);
205 return sp<MediaPlayer>(p); //(1)c++兩種初始化對象方法。
206 }
413 static void
414 android_media_MediaPlayer_start(JNIEnv *env, jobject thiz)
415 {
416 ALOGV("start");
417 sp<MediaPlayer> mp = getMediaPlayer(env, thiz); //(2)重載的操作符 =
418 if (mp == NULL ) {
419 jniThrowException(env, "java/lang/IllegalStateException", NULL);
420 return;
421 }
422 process_media_player_call( env, thiz, mp->start(), NULL, NULL ); //(3)
423 }
sp是什嗎?
mp是sp<MediaPlayer>的對象,怎麼的能調用到MediaPlayer的start函數呢?
sp就是個模板類。:
那mp怎麼調用start()的呢?
查看sp源碼類,就會發現sp類中重寫了->, 使->指向成員變數m_ptr(T* 模板參數的對象,如MediaPlayer),
mp->的返回值是m_ptr,即返回的是MediaPlayer的對象,當然能調用start方法了。
其實sp中還重寫了 & 和 = 操作符 。
mp的生命週期只在android_media_MediaPlayer_start方法裡面有效,方法執行完後就該釋放。
這就有問題了,如果mp裡面所有記憶體都釋放了,別的地方還有引用,就會出現null 指標。如果不釋放,別的地方又不引用了,就記憶體泄露了。
怎麼解決這個問題呢?
Android 引入了引用計數,weakref_impl類裡面儲存引用數目,記錄了T被引用的次數。引用次數為0時就釋放。但是如過,sp<T1> 和sp<T2>之間相互引用,就相互依賴,沒法釋放了。這時又引入了強引用和弱引用。
sp wp RefBase T 類之間的關係如
用sp<MediaPlayer>分析,計數過程,
return sp<MediaPlayer>(p); 構造時,執行m_ptr->incStrong(this)方法,使MediaPlayer對象的強弱引用都加一,
getMediaPlayer執行完後,會調用匿名對象的解構函式~sp,執行m_ptr->decStrong(this),使MediaPlayer對象的強弱應用都減一。
在android_media_MediaPlayer_start函數裡面,對mp進行賦值,使用的是重載的operator=,重載的過程也執行m_ptr->incStrong(this),也使MediaPlayer對象的強弱引用增加1。android_media_MediaPlayer_start函數執行完後,釋放mp,會調用mp的解構函式,執行m_ptr->decStrong(this),也使MediaPlayer對象的強弱引用都加一.如:
聽過wp簽證與sp簽證,兩個詞分別什意思,什不同?
新加坡的工作準證分為 EP,WP,SP三種。
WP 就是月薪1800以下,屬於勞務准證。WP= work permit ,中文翻譯為工作準證。
SP 是給月薪1800以上的,有本科或者專科學曆者申請的工作證。 SP= special pass,中文翻譯為特別准證。
EP分3種 1.p1 月薪7000以上,擁有被認可的大學或以上學曆,如professional qualification and specialist skills的人,而且工作是管理程或者proffessional ,administrative, executive 的工作。(就是進階的管理員和專業的職業) 2.p2 月薪3500-7000,要求與p1差不多一樣 3.P3 月薪2500 以上,學曆要求與p1一樣,有相關工作經驗和技術者比較適合
EP= Employment pass。
還有一種家屬准證(DP),英文為 dependent's pass。
netFramework-v35 與 netFramework-v35 SP1 這兩個版本的不同是什?
SP1是在v3.5版上打了一個補丁包之後的發布版,只需要裝SP1版就行