自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Android智能指針使用方法介紹

移動(dòng)開(kāi)發(fā) Android
Android智能指針的源代碼存放在哪個(gè)文件夾中?它是以何種方式定義的?應(yīng)該在什么情況中去使用?這些問(wèn)題都會(huì)在本文中找到答案。

Android手機(jī)操作系統(tǒng)既然是開(kāi)源的操作系統(tǒng)。那么在具體的文件夾中就會(huì)存放著各種相關(guān)功能的開(kāi)源代碼。我們?cè)谑褂玫臅r(shí)候可以根據(jù)這些源代碼進(jìn)行相應(yīng)的修改就能輕松的完成我們所需的功能。在這里大家就一起來(lái)看看Android智能指針的相關(guān)源碼解讀以及應(yīng)用方法。#t#

在Android的源代碼中,經(jīng)常會(huì)看到形如:sp< xxx>、wp< xxx>這樣的類型定義,這其實(shí)是Android中的智能指針。智能指針是C++中的一個(gè)概念,通過(guò)基于引用計(jì)數(shù)的方法,解決對(duì)象的自動(dòng)釋放的問(wèn)題。在C++編程中,有兩個(gè)很讓人頭痛的問(wèn)題:一是忘記釋放動(dòng)態(tài)申請(qǐng)的對(duì)象從而造成內(nèi)存泄露;二是對(duì)象在一個(gè)地方釋放后,又在別的地方被使用,從而引起內(nèi)存訪問(wèn)錯(cuò)誤。

程序員往往需要花費(fèi)很大精力進(jìn)行精心設(shè)計(jì),以避免這些問(wèn)題的出現(xiàn)。在使用智能指針后,動(dòng)態(tài)申請(qǐng)的內(nèi)存將會(huì)被自動(dòng)釋放(有點(diǎn)類似Java的垃圾回收),不需要再使用delete來(lái)釋放對(duì)象,也不需要考慮一個(gè)對(duì)象是否已經(jīng)在其它地方被釋放了,從而使程序編寫(xiě)工作減輕不少,而程序的穩(wěn)定性大大提高。

Android智能指針相關(guān)的源代碼在下面兩個(gè)文件中:

frameworks\base\include\utils\RefBase.h

frameworks\base\libs\utils\RefBase.cpp

 

Android中定義了兩種智能指針類型,一種是強(qiáng)指針sp(strong pointer),一種是弱指針(weak pointer)。其實(shí)成為強(qiáng)引用和弱引用更合適一些。強(qiáng)指針與一般意義的智能指針概念相同,通過(guò)引用計(jì)數(shù)來(lái)記錄有多少使用者在使用一個(gè)對(duì)象,如果所有使用者都放棄了對(duì)該對(duì)象的引用,則該對(duì)象將被自動(dòng)銷毀。

弱指針也指向一個(gè)對(duì)象,但是弱指針僅僅記錄該對(duì)象的地址,不能通過(guò)弱指針來(lái)訪問(wèn)該對(duì)象,也就是說(shuō)不能通過(guò)弱智真來(lái)調(diào)用對(duì)象的成員函數(shù)或訪問(wèn)對(duì)象的成員變量。要想訪問(wèn)弱指針?biāo)赶虻膶?duì)象,需首先將弱指針升級(jí)為強(qiáng)指針(通過(guò)wp類所提供的promote()方法)。弱指針?biāo)赶虻膶?duì)象是有可能在其它地方被銷毀的,如果對(duì)象已經(jīng)被銷毀,wp的promote()方法將返回空指針,這樣就能避免出現(xiàn)地址訪問(wèn)錯(cuò)的情況。

是不是很神奇?弱指針是怎么做到這一點(diǎn)的呢?其實(shí)說(shuō)穿了一點(diǎn)也不復(fù)雜,原因就在于每一個(gè)可以被智能指針引用的對(duì)象都同時(shí)被附加了另外一個(gè) weakref_impl類型的對(duì)象,這個(gè)對(duì)象中負(fù)責(zé)記錄對(duì)象的強(qiáng)指針引用計(jì)數(shù)和弱指針引用計(jì)數(shù)。這個(gè)對(duì)象是Android智能指針的實(shí)現(xiàn)內(nèi)部使用的,智能指針的使用者看不到這個(gè)對(duì)象。弱指針操作的就是這個(gè)對(duì)象,只有當(dāng)強(qiáng)引用計(jì)數(shù)和弱引用計(jì)數(shù)都為0時(shí),這個(gè)對(duì)象才會(huì)被銷毀。

說(shuō)了這么多原理,下面該看看到底智能指針該怎么使用了。假設(shè)現(xiàn)在有一個(gè)類MyClass,如果要使用智能指針來(lái)引用這個(gè)類的對(duì)象,那么這個(gè)類需滿足下列兩個(gè)前提條件:

(1) 這個(gè)類是基類RefBase的子類或間接子類;

(2) 這個(gè)類必須定義虛構(gòu)造函數(shù),即它的構(gòu)造函數(shù)需要這樣定義:

 

  1. virtual ~MyClass(); 

滿足了上述條件的類就可以定義Android智能指針了,定義方法和普通指針類似。比如普通指針是這樣定義:

 

  1. MyClass* p_obj; 

Android智能指針是這樣定義:

 

  1. spMyClass> p_obj; 

注意不要定義成 sp< MyClass>* p_obj。初學(xué)者容易犯這種錯(cuò)誤,這樣實(shí)際上相當(dāng)于定義了一個(gè)指針的指針。盡管在語(yǔ)法上沒(méi)有問(wèn)題,但是最好永遠(yuǎn)不要使用這樣的定義。

定義了一個(gè)智能指針的變量,就可以象普通指針那樣使用它,包括賦值、訪問(wèn)對(duì)象成員、作為函數(shù)的返回值、作為函數(shù)的參數(shù)等。比如:

 

  1. p_obj = new MyClass();   
  2. // 注意不要寫(xiě)成 p_obj = new spMyClass> 
  3. spMyClass> p_objp_obj2 = p_obj;  
  4. p_obj->func();  
  5. p_obj = create_obj();  
  6. some_func(p_obj); 

 

注意不要試圖delete一個(gè)Android智能指針,即 delete p_obj。不要擔(dān)心對(duì)象的銷毀問(wèn)題,智能指針的最大作用就是自動(dòng)銷毀不再使用的對(duì)象。不需要再使用一個(gè)對(duì)象后,直接將指針賦值為NULL即可:

 

  1. p_obj = NULL

上面說(shuō)的都是強(qiáng)指針,弱指針的定義方法和強(qiáng)指針類似,但是不能通過(guò)弱指針來(lái)訪問(wèn)對(duì)象的成員。下面是弱指針的示例:

 

  1. wpMyClass> wp_obj = new MyClass();  
  2. p_obj = wp_obj.promote();   
  3. // 升級(jí)為強(qiáng)指針。不過(guò)這里要用.而不是->,真是有負(fù)其指針之名啊  
  4. wp_obj = NULL

 

Android智能指針用起來(lái)是很方便,在一般情況下最好使用智能指針來(lái)代替普通指針。但是需要知道一個(gè)智能指針其實(shí)是一個(gè)對(duì)象,而不是一個(gè)真正的指針,因此其運(yùn)行效率是遠(yuǎn)遠(yuǎn)比不上普通指針的。所以在對(duì)運(yùn)行效率敏感的地方,最好還是不要使用智能指針為好。

責(zé)任編輯:曹凱 來(lái)源: CSDN
相關(guān)推薦

2011-07-01 14:28:47

Qt 指針

2015-07-27 11:34:03

Linux內(nèi)核指針

2021-09-09 17:05:36

C++智能指針語(yǔ)言

2009-12-29 10:40:36

ADO組件

2009-12-25 17:10:51

WPF動(dòng)態(tài)資源

2021-08-11 09:01:48

智能指針Box

2010-02-05 14:36:20

C++智能指針

2010-02-02 09:49:02

C++模板

2010-01-25 14:10:21

C++堆棧

2010-12-17 10:07:59

2023-11-17 11:48:08

智能指針C++

2009-08-28 17:01:43

C#構(gòu)造函數(shù)

2010-06-07 15:07:24

nutch+hadoo

2010-03-05 15:20:25

Linux man命令

2010-01-20 17:47:54

VB.NET注釋

2011-07-12 17:18:23

PHPstrtotime

2021-07-30 05:12:54

智能指針C++編程語(yǔ)言

2010-01-28 17:07:03

Android Gal

2009-12-01 18:02:41

PHP表單數(shù)組

2011-07-13 11:34:58

CC++時(shí)間函數(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)