oc语言的Foundation框架(学习笔记2)
紧接上文……
4、集合对象
4.1数组
1.基本概念
Foundation中的数组(NSArray,NSMutableArray)是一组有序的对象集合,通过索引下标获取到数组中的各个元素,也分可变和不可变。数组中不可以只存放基本数据类型,只能存放类的实例(对象)。如需要将基本数据类型、结构体放入数组中,需要通过NSNumber、NSValue进行 数据的”封装“。且不能在NSArray中存储nil(对象的零值或者NULL值)
2.不可变数组--NSArray
1) 数组初始化
NSArray *firstArray=[NSArray arrayWithObject:@"one"];
NSArray *secondArray=[NSArray arrayWithObjects:@"one",@"two",nil]; //多数组元素初始化时要以nil作为结束
NSArray *thirdArray=[NSArray arrayWithArray:secondArray];
NSArray *FourArray=[NSArray arrayWithContentsOfFile:path];
2) 常用方法
NSArray *array=[NSArray arrayWithObjects:@"one",@"two",nil];
NSInteger count=[array count]; //获取元素个数
NSString *firstObj=[array objectAtIndex:0]; //根据下标访问对象
NSArray *addArray=[array arrayByAddObject:@"dd"]; //追加对象,返回新数组对象
NSString *arrayStr=[array componentsJoinedByString:@","]; //用指定字符串将数组元素连起来
BOOL isContain=[array containsObject:@"bbb"]l //数组中是否包含某种对象
NSInteger index=[array indexOfObject:@"ccc"]; //查询指定对象在数组中的元素,如果没有此元素,返回NSNotFound
NSString *lastString=[array lastOfObject]; //获取数组中最后一个元素
3.可变数组——NSMutableArray,继承自NSArray
1)常用方法
NSMutableArray *mutableArray=[NSMutableArray arrayWithCapacity:5]; //初始化,设定元素个数为5,但可以更改
[mutableArray addObject:@"aa"]; //向数组中添加一个元素
[mutableArray insertObject:@"cc" atIndex:0]; //向数组中指定下标插入元素
[mutableArray removeLastObject]; //移除最后一个元素
[mutableArray removeObject:@"aa"]; //移除指定元素
[mutableArray addObjectFromArray:@"aa"]; //向数组中添加数组
[mutableArray replaceObjectAtIndex:0 withObject:@"replace"]; //替换指定的下标元素
[mutableArray removeallObjects]; //移除所有对象
2)遍历数组
常规方法
NSArray *array=[NSArray arrayWithObject:@"a",@"b",@"z",nil];
int length=[array count];
for(int i=0;i<length;i++){
NSString *element=[array objectAtIndex:i];
NSLog(@"%@",element);
}//性能低
快速枚举
for(NSString *string in array){
NSLog(@"found %@",string);
}//遍历的性能高
for(id string in array){
NSLog(@"found %@",string);
}//不确定数组元素类型时,可选择id
4.2 字典
1.基本概念
是由键-址对组成的数据集合。通过key(键),查找对应value(值),key通常时字符串对象,也可以是其他任意类型对象。在一个字典对象中key的值必须是唯一的。此外字典对象和值不能为空(nil),如果需要在字典中表示空值,可以用NSNull对象。
2.不可变字典——NSDictionary
1)字典初始化方法
NSDictionary *dic=[NSDictionary dictionaryWithObjectAndKeys:numObj,@"valueKey",numObj2,@"valueKey2",nil]; //初始化两个元素
NSDictionary *dic=[NSDictionary dictionaryWithDictionary:otherDic]; //初始化新字典,新字典包含otherDic
NSDictionary *dic=[NSDictionary dictionaryWithContentsOfFile:path]; //以文件内容初始化字典
2)常用方法
NSInteger count=[dic count]; //获取数量
NSObject *valueObj = [dic objectForKey:@"key"]; //通过key获取对应的value对象
NSEnumerator *enumerator =[dic keyEnumerator]; //将字典的key转化成一个每句对象,用于遍历
NSArray *key=[dic allKeys]; //获取所有键的集合
NSArray *values=[dic allValue]; //获取所有值的集合
3.可变字典——NSMutableDictionary继承自NSDictionary
1)常用方法
//初始化一个空的可变字典
NSMutableDictionary *dic2=[NSMutableDictionary dictionaryWithObject:@"v3" forKey:@"key2"];
//向字典2对象中添加整个字典对象3
[dic2 addEntriesFromDictionary :dic3];
//向字典2对象中追加一个新的key3和value3
[dic2 setValue:@"value3" forKey:@"key3"];
//初始化一个空间的可变字典
NSMutableDictionary *dic1=[NSMutableDictionary dictionary];
//将空字典1对象内容设置与字典2对象相同
[dic1 setDictionary:dic2];
[dic1 removeObjectForKey:@"key1"]; //将字典中key1对应的值删除
NsArray *array=[NSArray arrayWithObjects:@"key1",nil];
[dic2 removeObjectForKeys:array]; //根据指定的数组(key)移除字典1的内容
[dic1 removeAllObjects] //移除字典所有对象
2)遍历字典
快速枚举
for(id key in dic){
id obj =[dic objectForKey:key];
NSLog(@"%@",obj);
}
一般的枚举
NSArray *key = [dic allKeys];
int length = [keys count];
for(int i=0; i < length ;i++){
id key = [key objectAtIndex : i];
id key = [dic objectForKey : key];
NSLog(@"%@",obj);
}
通过枚举类型枚举
NSEnumerator *enumerator = [dic keyEnumerator];
id key = [enumerator nextObject];
while (key){
id obj = [dic objectForKey : key];
NSLog(@"%@",obj);
key = [enumerator nextObject];
}
4.3 集合的处理方法
1.基本概念
是一组单值对象夫人集合,且NSSet实例中元素是无须的,同一个对象只能保存一个,并且也分可变和不可变集合对象。
2.不可变集合 ——NSSet
1)NSSet的初始化
// 类似与数组的构建,直接创建一个集合
NSSet *set1 =[ [NSSet alloc] initWithObjects:@"one",@"two",nil ];
// 通过数组的构建集合
NSArray *array = [NSArray arrayWithObject:@"1",@"2",@"3",nil ];
NSSet *set2 = [ [NSSet alloc] initWithSet:set2];
//通过已有集合构集合
NSSet *set3 = [ [NSSet alloc] initWithSet:set2];
2)NSSet 常用方法
//集合3中对象个数
int count = [set3 count];
//以数组的相识返回集合3中所有的对象
NSArray *allObject = [set3 allObjects];
//返回集合3中的任意对象
id object = [set3 anyObject];
//集合4中是否包含内容为2的字符对象,有返回yes。
BOOL isContain = [set4 containObject :@"2"];
//集合4中与集合2章是否存在有相同元素的对象,有返回yes。
BOOL isIntersect = [set4 intersectsSet:set2];
// 集合4与集合5的元素是否完全匹配,匹配返回yes。
BOOL isEqual = [set4 isEqualToSet : set5];
//集合4是否是集合5的子集合,是返回yes。
BOOL isSubset = [set4 isSubsetOfSet:set5];
//创建一个新的集合1,集合2有两个对象(a和b)
NSSet *set1 = [NSSet setWIthObjects:@"a",nil];
NSSet *set2 = [set1 setByAddingObject:@"a"];
//通过已有集合7和集合8,创建一个新的集合9
NSSet *set7 = [NSSet setWIthObjects:@"a",nil];
NSSet *set8 = [NSSet setWIthObjects:@"z",nil];
NSSet *set9 = [ set7 setByAddingObjectFromSet:set8];
//通过已有集合10和数组对象,创建一个新的集合11
NSArray *array =[NSArray arrayWithObjects:@"a",@"b",@"c",nil];
NSSet *set10 = [NSSet setWIthObjects:@"z", nil];
NSSet *set11 = [set10 setByAddingObjectFromArray:array];
3.可变集合 ——NSMutableSet
1)常用方法
//创建一个空的集合
NSMutableSet *set1 = [NSMutableSet set];
NSMutableSet *set2 = [NSMutableSet setWithObjects:@"1",@"2",nil];
NSMutableSet *set3 = [NSMutableSet setWithObjects:@"a",@"2",nil];
//集合2“减去”集合3中的元素,集合2最后元素只有一个且为1
[set2 minusSet:set3];
//集合2与集合3中元素的交集,集合2最后元素只有一个且为2
[set2 intersectSet:set3];
//集合2与集合3中的元素的并集,集合2最后元素只有3个,且为,1,2,a
[set2 unionSet:set3];
//将空集合1设置为集合3中的内容
[set1 setSet:set3];
//根据数组内容删除集合中的对象
[set2 addObjectsFromArray:array];
[set2 removeObject:@"1"];
[set2 removeAllObjects];
5.数字对象的常用处理方法
5.1为了发送消息,则需要将基本数据类型当作对象来处理。把基本类型放在集合中(在COCOA中集合只能存放对象,无法存放基本数据类型),因此需要将基本数据类型转化为数字对象。OC中提供了数字对象“NSNumber”可以将基本数据类型“包装”成对象,这样就可以将基本数据类型来处理了。
1、数字对象的初始化
//类方法创建数字对象
int number = 10;
NsNumber *intNumber = [NSNumber numberWithInt :number];
BOOL isBoool = YES;
NSNumber *boolNumber = [NSNumber numberWithInt:isBool];
//实例方法创建数字对象
float pi = 3.14;
NSNumber *piNumber = [ [NSNumber alloc] initWithFloat :pi ];
char character='a';
NSNumber *cNumber = [ [NSNumber alloc] initWIthChar:character];
2、数字对象的转换
//还原成基本数据类型
int month = [intNumber intValue];
BOOL isOpen = [boolNumber boolValue];
float length = [piNumber floatValue];
char firstName = [cNumber charValue];
5.2NSValue和NSNull
1、NSValue
NSValue可以包装任意值(如结构体、指针等)
NSSize size = {100,200};
//@encode 将value值拷贝到newsize中(还原)
NSValue *value = [NSValue value:&size withObjectCType:@encode(NSSIze)];
NSSize newSize;
//将value值拷贝到newsize中(还原)
[value getValue:&newSize];
NSLog(@"new size : %@",NSStringFromSize(newSize));
2、NSNull
不能在集合中存储nil值是因为字典和数组中nil都有特殊的含义,但有时又确实需要存储一个表示“什么都没”的值。用NSNull代替,表示什么都不是,什么都没有。
6、 集合、数字对象的新写法
1、数组的新写法
NSArray *array = @[@"123",@456,@678];
id element1 = array[1];
NSLog(@"element 1:%@",element1);
NSMutableArray *mutableArray = [@[@"123",@456] mutableCopy];
id element2 = mutableArray[0];
NSLog(@"element 2: %@",element2);
2、字典的写法
NSDictionary *dic = @{@"key1":@0 , @"key2":@1 } ;
id value1 = dic [@"key1"];
NSLog(@"value 1 : %@",value);
NSMutableDictionary *mutableDic = [@{@"key3" : @1 , @"key4" : @2 } mutableCopy] ;
id value2=mutableDic[@"key3"] ;
NSLog(@"value2 : %@", value2);
3、嵌套写法
NSArray *newArray = @[@123,@456,@789];
NSArray *nestArray = @[newArray,@999,@[@11,@22] ] ;
NSDictionary *newDic = @{@"key10" : @[@11,@22] , @"key11" : nestArray} ;
NSMutableDictionary *mutableNewDIc = [@{@"key12" : newDic , @"key13" : @123 } mutableCopy] ;
4、新写法的内存管理
新语法创建的数组、集合,将被直接添加到自动释放池中。不需要用户手动释放,如需要长时间保留,可以用retain或copy,延长对象的生命周期。
1)初始化方法
NSNumber *intNum = @123;
NSNumber *floatNum = @3.14159f;
NSNumber *charNum = @'z';
NSNumber *boolNum = @YES;
NSNumber *number = @(12+num);
7、日期类的常用处理方法
1、时间戳的概念
某一日期到1970年的秒数大小,称为该日期的时间戳。
2、NSDate的基本概念
在Foundation框架中,提供了NSDate类,是cocoa提供给用处日期的类。提供日期的创建、比较、计算时间间隔等功能,是是常用的类库之一。
3、常用处理方法
//获取时间戳
NSTimeInterval time2001 = [date timeIntervalSinceReferenceDate] ;
NSLog(@"time 2001: %f",time2001 ) ;//GMT
NSTimeInterval time1970 = [date timeIntervalSince1970];
NSLog(@"time 1970: %f",time1970 ) ;//GMT
NSTimeInterval timeNow = [date timeIntervalSinceNow];
NSLog(@"time 2001: %f",time2001 ) ;//GMT
//昨天、今天、明天
NSTimeInterval time = 24*60*60;
NSDate *_yesterday = [ [NSDate alloc] initWithTimeIntervalSinceNow: -time] ;
NSDate *_today = [ [NSDate alloc] initWithTimeIntervalSinceNow:0] ;
NSDate *_tomorrow = [ [NSDate alloc] initWithTimeIntervalSinceNow:time] ;
1、常用处理方法
//在未来的一个时间,在远古的一个时间
NSDate *feature = [NSDate distantFuture] ;
NSLog(@"feature :%@",feature);
NSDate *ancient = [NSDate distantPast] ;
NSLog(@"ancient : %@",ancient) ;
//日期的比较
if(![ _yesterday isEqualToDate: _tomorrow]){
NSLog(@"不同的一天");
}
//返回一个早的时间
NSDate *earlierDate = [feature earlierDate : ancient ] ;
NSLog( @"laterDate : %@",laterDate) ;
//比较时间
NSComparsionResult result = [ _tomorrow compare:_today] ;
//时间戳转换成字符串
NSString *timeString = @"1234568790";
NSDate *convertDate = [NSDate dateWithTimeIntervalSince1970 : [timeString doubleValue] ];
NSLog(@"convertDate %@", convertDate);
/*NSDateFormatter格式化日期*/
NSDateFormatter *formatter = [ [ NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HHmm +0800"];
NSString *formatterDate = [formatter stringFromDate : [NSDate date] ];
NSLog(@"formatter Date : %@",formatterDate);