iOS UItableview重用機制

2021-06-19 02:59:26 字數 2588 閱讀 7537

重用機制的定義就是乙個節省記憶體的機制,當我們的tableview有100或更多資料是如果沒有重用機制那樣會把記憶體很快佔滿 尤其使大多數我們在cell上面放上,是乙個很佔記憶體的東西 

所以我們需要重用機制來解決,

重用機制就是在我們螢幕的可顯示範圍內建立cell 其餘的復用這些cell,以我個人的理解就是例如在我們可視範圍內建立10cell,當我們向上滑動是我們cell時 cell(0)就會進入重用佇列,當我們的cell(10)顯示時就會從重用佇列裡面取出來cell(0)來進行重用它 ,這好比就是乙個迴圈利用的過程 而重用佇列就是乙個容器,為了不讓我們常建立的cell用完一次就浪費掉,而是用完後存放在容器中,當我們新的資料要顯示的時候就不用再重新建立了,這樣極大的減少了記憶體的消耗  也是我們開發是想要的結果。

理解完了重用機制,我們再來看看怎麼去解決重用機制給我們帶來的一些開發時的小問題,在開發時我們經常會出現tableview上的檢視出現層疊的效果而不知所措,但是我們又不得不去面對。

通常我們要自定義cell的時候,我們盡量在通過下面的演示來規避

此**是 基於arc的環境下的

if(cell==nil){

通常我們這括號裡面建立檢視並加到cell.contentview   

例如:uiimageview *gimageview=[[uiimageview alloc]init];

給它乙個tag以便下面得到這個gimageview,因為這是乙個區域性的變數,所以我們在外面通過tag得到它

gimageview.tag=1000;

[cell.contentview addsubview gimageview] }

在這裡我們並沒有重新常見這個view  而是通過tag取的 

uiimageview *imagev=(uiimageview*)[cell.contentview viewwithtag:1000];

在外面給他資料,zh

imagev.image=image;

這樣就不會建立多個view而導致層疊的

***************在我們通常使用tableview時候我們會去建立乙個uitableviewcell的類

在這種情況下我們要了解重用機制,不讓它們建立多次

首先將我們要載入的檢視宣告為成員屬性,這樣在我的**中就不會建立多次了,我們在inint方法中取給它宣告乙個記憶體空間這裡我們給它乙個frame=cgrectzero佔位,然後將它加在contentview上,然後在下面layoutsubview中給它切確的frame,要不給個事例吧:

----》記住這些都是基於在arc環境下的

-(id)init {

[super init];

//我們在上面宣告的成員屬性self.imagev 給它乙個crgrectzero的佔位;

self.imagev=[[uiimageview alloc]initwithframe:crgrectzero];

//並且在這裡新增 到cell上

[self.contentview  addsubview:self.imagev]

}-(void)layoutsubview{

[super layoutsubview];

//在這裡根據業務上的需求,我們這裡給它frame,不過我們在使用之前還要再一次將它的frame製成cgrectzero

self.imagev.frame=cgrectzero;這是為了當你下次使用之前再將他的frame製成佔位

self.imagev.frame=cgrectmake(x,x,x,x);

這樣就會使得在多次顯示時 我們只建立乙個view,因為他是成員屬性了

}***********還有一種方法雖然可以解決問題 但是這違背了我的重用機制 本人不建議使用 

在這裡如果是資料量較小的情況下可以使用,但是在資料量較大的情況下這樣很危險,它是通過改變了identifier標識,這就是意味著每個cell的標識都不一樣 也就是每條資料都建立乙個cell 例子:

- (uitableviewcell *)tableview:(uitableview *)tableview cellforrowatindexpath:(nsindexpath *)indexpath

{nsstring *cellidentifier=[nsstring  stringwithformate:@「%@」,indexpaht];

gwtableviewcell

*cell = (

gwtableviewcell

*)[tableview

dequeuereusablecellwithidentifier

:cellidentifier];

這樣可以解決問題 但是有木有想過 當你有一千條資料時 你是不是要建立1000個cell呢 是不是會佔很大的記憶體呢

} ***********這裡還有一種就是通過tag的方法

當我們使用的時候通過tag取的view,然後判斷當前cell.contentview是否為空,如果不為空那就remove掉

但是個人覺得這樣效率太低了 你想象每當你有條資料展示時 都要remove上乙個檢視裡面的view 那樣是不是代價太高了

這裡就不用**演示了,因為太晚了 ,諒解......  

本博文純屬個人理解,如有大神嫁到,請稍加提點

iOS UITableView的cell重用標識

uitableview繼承自uiscrollview,是蘋果為我們封裝好的乙個基於scroll的控制項。上面主要是乙個個的 uitableviewcell,可以讓uitableviewcell響應一些點選事件,也可以在uitableviewcell中加入 uitextfield或者uitextvie...

IOS UITableView下拉重新整理

給 uitableview 新增 下拉重新整理 pull refresh 屬性 親愛的,我還是有些不忍心,不過事情的經過是這樣的 cocoa touch 的 官方 sdk 裡,壓根就沒實現這個 pull refresh 的功能。恩,這事真不是賈伯斯手下幹的。然而也不是麻匪幹的。是他幹的,enorme...

IOS UITableView 實現LOL資料展示

本節重點 了解uitableview 的基本屬性 了解kvc.其實 我也不是很了解 效果圖 示例 控制器 sjviewcontroller.m 03.lol demo created by sj.abnormal on 15 2 7.import sjviewcontroller.h import ...