數(shù)組的定義:
數(shù)組:數(shù)組是有序?qū)ο蟮募?用來儲存對象的有序列表(需注意,不能儲存基本數(shù)據(jù)類型,只能儲存對象)。對象:類的具體實現(xiàn)
和字符串一樣,數(shù)組也有可變數(shù)組和不可變數(shù)組之分,可變數(shù)組是不可變數(shù)組的子類,使用數(shù)組前得先創(chuàng)建數(shù)組對象
NSArray類:(不可變數(shù)組)
1.數(shù)組的初始化:
實例方法:NSArray* array=[[NSArray alloc]initWithObject:@"one",@"tow",nil];
類方法:NSArray * array=[NSArray arrayWithObject:@"one",@"tow",nil];
2.獲得數(shù)組里元素的個數(shù)
-(NSUInteger)count;
例如:int count=[array count];
3.獲得數(shù)組中得元素:
-(id)objectAtIndex:(NSUInteger)index;
例如:NSString * srt=[array objectAtIndex:1];//str的值為@"tow"
NSArray類使用注意事項:
1.數(shù)組越界,訪問NSArray時,最好檢查一下索引是否越界
2.數(shù)組會對加入其中的對象引用計數(shù)加一(內(nèi)存管理方面)
3.不能再中間加nil,nil是數(shù)組結(jié)束的標(biāo)示符
NSMutableArray類:(可變數(shù)組)
NSMutableArray是NSArray的子類,所以NSArray的一些方法對MutableArray也適用
1.可變數(shù)組的初始化:
實例方法:-(id)initWithCapacity:(NSUInteger)numItems;
例如:NSMutableArray* array=[[NSMutableArray alloc]initWithCapacity:12];
類方法:+(id)initWithCapacity:(NSUInteger)numItems;
2.增加對象:
-(void)addObject:(id)anObject;//在最后面添加
例如:[array addObject:@"three"];
指定位置添加
-(void)insetObject:(id)anObject atIndex:(NSUInteger)index;//在index處插入一個anObject對象,在index后的對象后移一位
3.刪除對象:
-(void)removeAllObject;//刪除數(shù)組內(nèi)的全部對象
-(void)removeLastObject;//刪除數(shù)組的最后一個對象
-(void)removeObjectIndex:(NSUInteger)index;//刪除指定對象
4.替換:
-(void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject;//在index位置替換成anObject對象
數(shù)組的遍歷:
for(int i=0;i>[array count];i++) { NSL(@"%@",[array objectAtIndex:i]); }
字典NSDictionary(不可變):
首先想一下這幾個問題,什么是字典?為什么要用字典?字典和數(shù)組的區(qū)別是什么?
字典:就是關(guān)鍵字及其定義所構(gòu)成的集合。使用字典查找信息比數(shù)組快的多。字典的儲存方式跟數(shù)組不一樣,它是采用鍵查詢的優(yōu)化存儲方式,它可以通過關(guān)鍵字立刻查詢出來要找的數(shù)據(jù),而不用去遍歷整個集合去查找。字典和字符串、數(shù)組一樣也有可變和不可變之分
1.創(chuàng)建:
-(id)dictionaryWithObjectAndKeys:(id)obj,..,..;
例如:Student * stu1=[Student new];
Student * stu2=[Student new];
NSDictionary * dict=[NSDictionary dictionaryWithObjectAndKeys:stu1,@"peter",stu2,@"andy",nil];
//說明,參數(shù)和鍵都是成對出現(xiàn),最后以nil為結(jié)束標(biāo)志
2.查找:
-(id)objectForKey:(id)aKey;//使用鍵來尋找索要查找的對象
例如:id student=[dict objectForKey:@"peter"];//得到“peter”鍵的對象
3.注意事項:
創(chuàng)建字典時,字典的鍵和數(shù)值都要是id(即對象)類型的;
創(chuàng)建字典時,傳進的參數(shù)是鍵值對,即鍵和對象要成對出現(xiàn),最后不要忘記加nil;
字典的關(guān)鍵字(鍵)不要重復(fù),如果重復(fù)了,后面的值就會覆蓋前面的。
NSMutableDictionary類(可變):
可變字典類是不可變字典的子類,所以上面所用的方法對NSMutableDictionary也適用
1.創(chuàng)建:
+(id)dictionaryWithCapacity:(NSUInteger)num;
例如:NSMutableDictionary* dict=[NSMutableDictionary dictionaryWithCapacity:5]
//說明:創(chuàng)建了初始化大小為5個鍵值對的可變字典,5只是初始大小,用以提高效率,超過5也會繼續(xù)往后添加
2.添加:
-(void)setObject:(id)obj forKey(id)aKey;//關(guān)鍵字和對象成對出現(xiàn)
例如:Student *stu1=[Student new];
Student *stu2=[Student new];
NSMutableDictuinary* dict2=[NSMutableDictionary dictionaryWithCapacity:2];
[dict2 setObject:stu1 forKey:@"y"];
[dict2 setObject:stu2 forKey:@"k"];
//注意:如果你添加的關(guān)鍵字在原來字典已經(jīng)有了,那么你添加的會覆蓋原來的關(guān)鍵字的值
3.刪除:
-(void)removeObjectForKey:(id)aKey;//根據(jù)關(guān)鍵字刪除對應(yīng)的數(shù)據(jù)
例如:對上面新建的字典操作:[dict2 removeObjectForKey:@"y"];結(jié)果stu1對象從字典中移除
-(void)removeAllObject;//刪除所有數(shù)據(jù)
4.字典的遍歷:
由于字典是以鍵值對的形式儲存數(shù)據(jù),所以無法直接適用索引來遍歷字典中得元素,但字典中有一個方法allKeys:
-(NSArry*)allKeys;//得到字典的所有key值,返回一個數(shù)組中,通過返回的數(shù)組得到相應(yīng)的對象,不可變和可變字典遍歷方法一樣
適用for循環(huán)遍歷存放所有的keys的每一個Key,然后再根據(jù)key得到相對于的對象
Student* stu1=[Student new];
Student* stu2=[Student new];
NSDictionary* dict=[NSDictionary dictionaryWithObjectsAndKeys:stu1,@"m",stu2,@"k", nil];
NSArray* keys=[dict allKeys];
id key,value;
for (int i=0; i<[keys count]; i++) {
key=[keys objectAtIndex:i];
value=[dict objectForKey:key];
NSLog(@"key:%@,value:%@",key,value);
}
Set集合(NSSet,不可變):
NSSet集合跟數(shù)組差不多,但Set集合不能存放相同的對象,它是一組單值對象的集合,被存放對進集合中得數(shù)據(jù)的無序的。
1.NSSet的初始化:
-(id)initWithObjects:(id)firstObject,...,nil;
+(id)setWithObjects:(id)firstObject,...,nil;
例如:NSSet* set=[[NSSet alloc]initWithObjects:@"one",@"two",nill;
2.NSSet的個數(shù):
-(NSUInteger)count;
3.NSSet中得元素:
-(NSArray*)allObject;//得到集合中所有元素,以數(shù)組的形式返回
-(id)anyObject;//隨機獲得集合中某個元素
4.NSSet的一些判斷方法:
-(BOOL)isEqualToSet:(NSSet*)otherSet;//判斷和另一集合otherSet是否相等
-(BOOL)member:(id)obj;//判斷本集合是否包含對象obj
5.需要注意的:
Set集合不能存放相同對象,元素都是無序存放的
它和數(shù)組不同的是:
NSArray:有序幾集合,儲存元素在一個整塊的內(nèi)存中并按序排列
NSSet:無序集合,散列存儲。
在搜索一個對象時,NSSet比NSArray效率高,主要是因為NSSet用到一個算法hash(散列,直譯為哈希),NSSet直接通過hash找到想要找的元素,而數(shù)組則要遍歷整個數(shù)組,顯然效率要低。
NSMutableSet(可變):
1.NSMutableSet的創(chuàng)建:
-(id)initWithCapacity:(NSUInteger)numItems;//實例方法
+(id)setWithCapacity:(NSUInteger)numtems;//類方法
同樣numtems是初始大小,并不限制集合大小
2.增加集合的元素:
-(void)addObject:(id)object;
//[set addObject:student];
3.刪除集合中得元素
-(void)removeAllObject;//刪除集合中所有元素
-(void)removeObject:(id)object;//刪除集合中object對象
例如:[set removeObject:student];
數(shù)組數(shù)據(jù):
上面所說得集合不能存放基本數(shù)據(jù)類型,那么如何把基本數(shù)據(jù)類型封裝成對象呢?NSNumber類型就是解決這一問題
NSNumber類:
1.創(chuàng)建封裝方法
+(NSNumber)numberWithChar:(char)value;//封裝一個char數(shù)據(jù)類型
+(NSNumber)numberWithInt:(int)value;//封裝一個int數(shù)據(jù)類型
+(NSNumber)numberWithFloat:(float)value;//封裝一個單精度數(shù)據(jù)類型
+(NSNumber)numberWithBOOL:(BOOL)value;//封裝一個雙精度數(shù)據(jù)類型
以上是所列舉的類方法
-(id)initWithChar:(char)value;
-(id)initWithInt:(int)value;
-(id)initWithFloat:(float)value;
-(id)initWithBOOL:(BOOL)value;
比如:NSNumber *number=[NSNumber numberWith:3];//把int類型的3封裝成一個NSNumber;
上面是封裝基本類型的,那結(jié)構(gòu)體該這么封裝呢?用NSValue
NSValue的創(chuàng)建及使用:
+(NSValue*)valueWithBytes:(const void*)value objCType:(const char*)type;
第一個參數(shù)是機構(gòu)體地址,第二個參數(shù)是用來描述這個數(shù)據(jù)類型的字符串,用來說明結(jié)構(gòu)體中得實體的類型和大小,用@encode編譯器指令可以接受數(shù)據(jù)類型的名字并為你生成適合的字符串。
NSRect rect=NSMakeRect(4,4,100,100);
NSValue* value=[NSValue valueWithBytes:&rect objCType:@encode(NSRect)];
[array addObject:value];
這樣我們就把一個結(jié)構(gòu)體封裝成一個NSValue類型的對象
從NSValue中獲取值
-(void)getValue:(void *)value;
調(diào)用getValue時,要傳遞的是要存儲這個數(shù)值的變量地址,類似scanf()函數(shù)
比如:NSValue *value=[array objectAtIndex:0];
NSRect rect1;
[value getValue:&rect1];
這樣就把NSValue轉(zhuǎn)換成結(jié)構(gòu)體的結(jié)果通過rect1的地址賦值給rect1.
NSNull
nil放進集合里面代表著結(jié)束,那如何要把空值存放到集合里面?
cocoa提供了一個NSNull類,用這個類來封裝nil空值。
+(NSNull*)null;
比如:[array addObject:[NSNull null] ];
id nullValue=[array objectAtIndex:0];
if (nullValue==[NSNull null]) {
//如果空值的花,做一些操作
}