OC之集合家族

2021-07-04 11:43:32 字數 3775 閱讀 4264

nsarray是乙個cocoa類,用來儲存物件的有序列表,你可以在其中放入任意型別的物件:nsstring或者是其他你想要儲存的物件,但只能是儲存objective-c的物件,而不能儲存c語言中的基本資料型別,如int、float、enum、struct,或者nsarray中的隨機指標,同時也不能在nsarray中儲存nil(物件的零值或者null值)。只要有了乙個nsarray,就可以通過各種方式操作它,例如讓某個物件的例項物件指向這個陣列,將該陣列當作引數進行傳遞,獲取資料中所存物件的個數,根據索引來得到相應的物件,查詢陣列中的物件,遍歷陣列等等。

arraywithobjects:建立乙個新的nsarray,傳送乙個以逗號分隔的物件列表,可在列表結尾新增nil代表列表結束,這也是為什麼陣列不能儲存nil的原因之一。

nsarray *array;

array = [nsarray arraywithobjects:

@「one」, @「two」,@「three」,nil];

通過nsarray的count:方法可以得到陣列的個數;

- (unsigned)count;

也可以如下所示獲取特定索引處的物件:

(id) objectatindex: (unsigned int) index; 例:

int i;

for(int i=0; i < [array count]; i++){

nslog(@「index %d has %」, i, [array objectatindex: i]);

輸出結果:略。

如果引用的索引計數大於陣列裡面物件個數,執行時就會輸出錯誤。

nsarray與nsstring一樣,建立的是乙個不可變的。一旦你用了特定數量的物件建立了乙個陣列,那麼它就固定下來了:既不能新增任何元素,也不能刪除任何元素。當然,陣列裡面的物件是可以改變的,陣列自身是不會改變的。

因此引起乙個新的可變陣列nsmutablearray,這樣就可以隨意的新增或者刪除陣列中的物件。

常用的方法如下:

arraywithcapacity:來建立新的可變陣列:

+ (id) arraywithcapacity: (unsigned) numitems; 例:

nsmutablearray *array;

array = [nsmutablearray arraywithcapacity: 17];

addobject:在陣列末尾新增物件

- (void)addobject:(id)anobject;

removeobjectatindex:刪除特定索引處的物件。

- (void) removeobjectatindex: (unsigned) index;

如果要編寫乙個從0到[array count]的迴圈來讀取每個索引處的物件,也可以使用nsenumerator,它是cocoa用來描述這種集合迭代運算的方式。要想使用nsenumerator,需要通過objectenumerator向陣列請求列舉器:

- [nsenumerator *]objectenumerator;

你可以按如下方式使用這個方法:

[nsenumerator *enumerator;

enumerator = [array objectenumerator];

如果你想要從後向前瀏覽 ,還可以使用reverseobjectenumerator

在獲得列舉器之後,可以開始乙個while迴圈,每次迴圈都向這個列舉器請求它的nextobject(下乙個物件):

- (id) nextobject;

當nextobject返回nil值時,迴圈結束,這也是不能在陣列中儲存nil值的另乙個原因:我們沒有辦法判斷nil是儲存在陣列中的數值還是代表結束的標誌。

整個迴圈如下:

nsenumerator *enumerator;

enumerator = [array objectenumerator];

id thingie;

while (thingie = [enumerator nextobject])

nslog(@「i found %@」,thingie);

備註及疑問:如果要使用列舉器,有乙個問題,就是不能用增加或者刪除這類的方法去操作這個可變陣列,要不然的話,就會出現問題。這是乙個問題,可以試試!

for (nsstring *string in array){

nslog(@「i found %@」,string);

這樣,遍歷陣列就有三種方式了,通過索引、使用nsenumerator和快速列舉。

nsdictionary在給定的關鍵字下儲存乙個數值(可以是任何型別的物件)。然後可以用這個關鍵字來查詢相應的數值。nsdictionary與nsarray和nsstring一樣是不可變的物件,但是nsmutabledictionary類允許你隨意新增和刪除字典元素。在建立新的nsdictionary時,就要提供該字典的全部物件和關鍵字。

dictionarywithobjectsandkeys:建立字典。

+ (id) dictionarywithobjectsandkeys:(id)firstobject,(nsstring)firstkey,,,,;

dictionary接受物件和關鍵字交替儲存的系統,以nil值為終止符。

例:tire *t1 = [tire new];

tire *t2 = [tire new];

tire *t3 = [tire new];

tire *t4 = [tire new];

nsdictionary *tires;

tires = [nsdictionary dictionarywithobjectsandkeys: t1,@」front-left」, t2, @」front-right」, t3, @」back-left」, t4, @」back-right」, nil];

objectforkey:來獲取字典中的值,向方法傳遞之前用來儲存該值的關鍵字。

- (id) objectforkey: (id) akey;

所以,要從字典中找到其中的乙個物件,可以這樣寫:

tire *tire = [tires objectforkey: @」 back-left」];

如果根據關鍵字查不到物件,那麼objectforkey:會返回nil值。

要建立新的numutabledictionary物件,向類nsmutabledictionary傳送dictionary訊息。你也可以使用dictionarywithcapacity:方法來建立新的可變字典並且告訴最終大小。

+ (id) dictionarywithcapacity: (unsigned int) numitems;

setobject:forkey:方法給字典新增元素:

- (void) setobject: (id) anobject forkey: (id) akey;

下面是另一種建立儲存輪胎的字典的方法:

nsmutabledictionary *tires;

tires = [nsmutabledictionary dictionay];

[tires setobject: t1 forkey:@」front-left」];

注意:如果對字典中已有的關鍵字使用setobject:forkey:,那麼這個方法將會用新值替換原有的數值。如果你想在可變字典刪除乙個關鍵字,可使用removeobjectforkey:方法:

- (void) removeobjectforkey:(id) akey;

例:[tires removeobjectforkey:@」back-left」];

objective c之集合家族

nsarray是乙個cocoa類,用來儲存物件的有序列表,你可以在其中放入任意型別的物件 nsstring或者是其他你想要儲存的物件,但只能是儲存objective c的物件,而不能儲存c語言中的基本資料型別,如int float enum struct,或者nsarray中的隨機指標,同時也不能在...

集合大家族

今天看到了一張集合的圖,想著有空了進行整理整理,前面高能,哈哈哈哈 看圖 我們可以看到在集合 容器 的左右都有介面,而右邊的偏多,這張圖總結了各個介面的優缺點以及面試中會遇到的問題。右邊 iterable iterable是iterator 迭代器 的父類,實現了iterable介面的類都可以擁有增...

OC集合記憶體管理

集合記憶體管理 陣列。字典 1.物件加入集合物件中,retaincount 1 2.物件從集合物件中移除,retaincount 1 3.集合物件的retaincount改變,其中元素的retaincount不變 4.集合被銷毀時,其中元素release一次 person person person...