認識數(shù)組
1)數(shù)組是一個有序的元素序列,支持隨機存儲傲隶。索引從0開始,索引訪問越界會拋出運行時異常窃页。注意與C語言數(shù)組不同跺株。
----------------NSArray初始化------------
//工廠方法 最后放nil 表示結束 它不是元素
NSArray *array1=[NSArray arrayWithObjects:@"Shanghai",@"Beijing",@"New York",@"Paris", nil];
//內存分配alloc+init初始化
NSArray *array2=[[NSArray alloc] initWithObjects:@"Shanghai",@"Beijing",@"New York",@"Paris", nil];
//使用字面常量 不需要Nil
NSArray *array3=@[@"Shanghai",@"Beijing",@"New York",@"Paris"];
NSLog(@"array1 count: %lu" ,array1.count);//4
NSLog(@"array2 count: %lu" ,array2.count);//4
NSLog(@"array3 count: %lu" ,array3.count);//4
NSLog(@"array1: %@" ,array1);//按字符串方式打印出來
2)NSArray被定義為class,引用類型脖卖,拷貝時具有引用語義乒省。
3)NSArray的元素必須是對象,即NSObject的子類:
*如為基本數(shù)據(jù)類型畦木,需要用NSNumber封裝為對象類型后袖扛,才能放入數(shù)組里面。
*如果為C語言結構類型十籍,需要用NSValue封裝為對象類型后蛆封,才能放入數(shù)組中。
*數(shù)組元素可以是不同對象類型妓雾,可能會有類型不安全娶吞。(取值的時候不清楚是什么類型)
//----------------數(shù)組元素-------------
NSString *text=@"Panda";//字符串對象
NSInteger number=100;//不是對象 是從新定義后的整數(shù) 基于cpu架構 還是值類型
NSNumber *numberObject1=
[NSNumber numberWithInteger:number ];//使用NSNumber將NSInteger包裝為對象
NSNumber *numberObject2=@300u;//使用字面常量初始化
Point point;//結構類型也不行 需要使用NSValue將struct包裝為對象 編碼方式將Point寫進去
point.h=100;
point.v=200;
NSValue *pointObject=
[NSValue value:&point withObjCType:@encode(Point)];//使用NSValue將struct包裝為對象
NSNull* nullValue=[NSNull null];
NSArray *array4=@[text, numberObject1,numberObject2,pointObject, nullValue];
NSLog(@"array4: %@" ,array4);
4)NSArray具有常量性:長度和元素指針都不能更改。但指針指向的對象內部可以更改械姻。
//----------------數(shù)組的常量性-------------
BLNPoint *p1=[[BLNPoint alloc] initWithX:10 WithY:20];
BLNPoint *p2=[[BLNPoint alloc] initWithX:20 WithY:40];
BLNPoint *p3=[[BLNPoint alloc] initWithX:30 WithY:60];
BLNPoint *p4=[[BLNPoint alloc] initWithX:40 WithY:80];
NSArray *array5=@[p1,p2,p3,p4];
NSLog(@"array5: %@", array5);
BLNPoint *p5=[[BLNPoint alloc] initWithX:50 WithY:100];
//1. 更改元素長度-----不可以妒蛇!
//[array5 addObject:p5];
//2. 更改元素指針-----不可以机断!
//array5[0]=p5;
//3. 更改指針指向的內容-----可以!
for(int i=0;i<array5.count;i++){
BLNPoint *pt= array5[i];//取出每個元素
pt.x++;//將指針里面指向的內容更改
pt.y++;
}
NSLog(@"array5: %@", array5);
數(shù)組的常用操作:
//----------------數(shù)組的遍歷-------------
最快-Fast Enumeration绣夺,直接訪問內存吏奸,優(yōu)化索引檢查,快5-10倍 建議用這種
//快速枚舉 如果不知道類型 用id 或者 object
for ( BLNPoint* point in array5)
{
point.x++;
point.y++;
}
較慢-NSEnumerator遍歷 索引檢查+動態(tài)消息調用
//迭代器模式
NSEnumerator *enumerator = [array5 objectEnumerator];
BLNPoint* item;
while (item = [enumerator nextObject])//消息分發(fā)
{
item.x++;
item.y++;
}
最慢-For循環(huán)訪問:索引檢查+動態(tài)消息調用
//for循環(huán)
for (int i=0; i<array5.count; i++) {
NSLog(@"array5[%d],%@",i,array5[i]);//訪問索引
}
數(shù)組查找
1)indexofobject查找是否存在“值相等”的對象(類型需要實現(xiàn)isEqual)
2)indexofobjectIdenticalTo 查找是否存在“指針相等”的對象
//數(shù)組查找
BLNPoint* target=[[BLNPoint alloc] initWithX:33 WithY:63];
NSUInteger index1=[array5 indexOfObject:target];//查找值是否相等
NSUInteger index2=[array5 indexOfObjectIdenticalTo:p3];//指針引用是否相等
NSLog(@"find at %lu", index1);//find at 2
NSLog(@"find at %lu", index2);//find at 2
在進行查找值是否相等的時候 需要寫這個方法:
- (BOOL)isEqual:(id)anObject{
if (! [anObject isKindOfClass: [BLNPoint class]] ){
return false;
}
BLNPoint* other=anObject;
return (self.x==other.x && self.y==other.y);
}
數(shù)組排序
不改變原數(shù)組(常量性)陶耍,返回新數(shù)組
//數(shù)組排序 字母排序 不更改里面的內容 取返回值給新的數(shù)組
NSArray* sortArray1=[array1 sortedArrayUsingSelector:@selector(compare:)];
NSLog(@"array1: %@" ,array1);
NSLog(@"sortArray1: %@" ,sortArray1);
結果:
array1: (
Shanghai,
Beijing,
"New York",
Paris
)
sortArray1: (
Beijing,
"New York",
Paris,
Shanghai
)
使用NSMutableArray
NSMutableArray支持更改數(shù)組長度和元素指針奋蔚。為NSArray的子類。
//初始化
NSMutableArray *muArray1=[NSMutableArray arrayWithObjects:p1,p2,p3,p4, nil];
NSLog(@"before change, muArray1: %@",muArray1);
BLNPoint *p6=[[BLNPoint alloc] initWithX:60 WithY:120];
BLNPoint *p7=[[BLNPoint alloc] initWithX:70 WithY:140];
//修改元素
[muArray1 addObject:p5];//增加一個元素
[muArray1 removeObjectAtIndex:2];//將p3元素刪除
[muArray1 insertObject:p6 atIndex:1];//在1位置上插入p6
muArray1[0]=p7; //[muArray1 setObject:p7 atIndexedSubscript:0];
NSLog(@"after change, muArray1: %@",muArray1);
NSMutableArray初始化后烈钞,會分配一個緩存容量capacity,一般大于實際元素數(shù)量泊碑,當長度增長時,如實際需求大于capacity會以近似2倍的方法指數(shù)增長毯欣。伴隨代價:
分配新的堆內存2capacity
*將原來堆內存上的元素拷貝到新的內存
*釋放原來的堆內存
//預估容量
int count=100;
NSMutableArray *muArray2=[NSMutableArray arrayWithCapacity:10];
for (int i=0; i< count; i++) {
BLNPoint *pt=[[BLNPoint alloc] initWithX:i*10 WithY:i*20];
[muArray2 addObject: pt];
}
最佳實踐:估計好capacity,預先分配一定容量馒过,避免以后增長。
盡量避免使用insertObject:atIndex:和removeObjectAtIndex操作酗钞,因為會改變數(shù)組元素序列腹忽,涉及大量內存拷貝操作,代價高砚作。前移后移的操作窘奏。
認識NSSet集合(無序)
NSSet是一個無序的集合,其存儲的對象不能重復葫录。
NSSet被定義為class着裹,引用類型,拷貝時具有引用語義压昼。
常量集合NSSet求冷,可變集合:NSMutableSet:
常量性:長度和指針元素都不能更改。但指針指向的對象內部可以更改窍霞。
創(chuàng)建NSMutableSet時用initwithcapacity提前設置capacity
支持Fast Enumeration和NSEnumerator變量,前者較快拯坟。
void setDemo()
{
//---------------- NSSet 與 NSMutableSet-------------
//初始化
NSSet *set1 =
[NSSet setWithObjects:@"Shanghai",@"Beijing",@"New York",@"Paris", nil];
NSLog(@"set1 count: %lu", set1.count);
NSMutableSet *set2 =
[NSMutableSet setWithObjects:@"Shanghai",@"Beijing",@"New York",@"Paris", nil];
[set2 addObject:@"London"];
[set2 addObject:@"Paris"];
[set2 removeObject:@"Beijing"];
NSLog(@"set2 count: %lu", set2.count);
//判斷是否包含某個對象
if([set2 containsObject:@"Shanghai"])
{
NSLog(@"set2 contains Shanghai");
}
//遍歷
for(NSString* item in set2)
{
NSLog(@"%@", item);
}
}
認識字典NSDictionary
NSDictionary是一個存儲key-value的無序集合但金,key唯一,value可重復郁季。
NSDictionary被定義為class冷溃,引用類型,拷貝時具有引用語義梦裂。
常量集合NSDictionary似枕,可變集合:NSMutableDictionary:
常量性:長度和指針元素都不能更改。但指針指向的對象內部可以更改年柠。
創(chuàng)建NSMutableDictionary時用initwithcapacity提前設置capacity
支持Fast Enumeration和NSEnumerator變量凿歼,前者較快。
void dictionaryDemo()
{
//---------------- NSDictionary 與 NSMutableDictionary-------------
BLNPoint *p1=[[BLNPoint alloc] initWithX:10 WithY:20];
BLNPoint *p2=[[BLNPoint alloc] initWithX:20 WithY:40];
BLNPoint *p3=[[BLNPoint alloc] initWithX:30 WithY:60];
BLNPoint *p4=[[BLNPoint alloc] initWithX:40 WithY:80];
BLNPoint *p5=[[BLNPoint alloc] initWithX:50 WithY:100];
//@{key:value}
NSDictionary *dictionary1 = @{
@"Shanghai" : p1,
@"Beijing" : p2,
@"New York" : p3,
@"Paris" : p4};
//[value,key ,nil結束]
NSMutableDictionary *dictionary2 = [NSMutableDictionary dictionaryWithObjectsAndKeys:
p1,@"Shanghai",
p2,@"Beijing",
p3,@"New York",
p4,@"Paris",
nil];
NSLog(@"dictionary1 count: %lu", dictionary1.count);
NSLog(@"dictionary2 count: %lu", dictionary2.count);
BLNPoint* result1=[dictionary1 objectForKey:@"Beijing"];//查value是什么
BLNPoint* result2=dictionary1[@"Shanghai"];
NSLog(@"%@", result1);
NSLog(@"%@", result2);
for(NSString* key in dictionary1)
{
id object=dictionary1[key];
NSLog(@"key:%@, object:%@", key, object);
}
[dictionary2 setObject:p5 forKey:@"London"];
[dictionary2 removeObjectForKey:@"Shanghai"];
NSLog(@"dictionary2: %@", dictionary2);
}