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...