集合类(注意在基本数据类型前加上@相当于转换为对象)
字典(它是一个无序的集合,它是通过键值对的方式来存储数据的。)字典中所有的key都是唯一的,不过值没有要求,值可以重复。
1、不可变字典(一经创建里面的元素就不可以改变了)的创建(值键值键值键值键)key是有要求的,只有NSCopying才能成为字典里面的key。
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"lala",@"name",@10,@"age" ,nil];
简便的方式创建
NSDictionary *dict1 = @{@"name":@"shuangshuangshuang",@"age":@20};
2、取出某个键所对应的值
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"lala",@"name",@10,@"age" ,nil];
NSNumber *number = [dict objectForKey:@"age"];
int num = [number intValue];
//简便的取值方式(最常用的方式)
NSString *name = dict[@"name"];
3、取出字典的长度
long length =[dict count] | dict.count ;
4、字典的遍历
1、先取出字典中的key,然后使用数组的方式对键进行遍历
NSArray *arr = [dict1 allKeys];
for (int i = 0 ; i < arr.count ; i++) {
NSLog(@"%@",dict1[arr[i]]);
}
----------------------------------------------------
for (NSString *key in arr) {
NSLog(@"%@ = %@",key,dict1[key]);
}
2、使用增强的for变量字典
for (NSString *key in dict1) {
NSLog(@"%@ = %@",key,dict1[key]);
}
3、枚举器的方式
NSEnumerator *enumerator = dict1.keyEnumerator;//注意是keyEnumerator
NSString *key = nil;
while (key = [enumerator nextObject]) {
NSLog(@"%@ = %@",key,dict1[key]);
}
4、block的方式
[dict1 enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
NSLog(@"%@ = %@",key, obj | dict1[key]);
}];
5、取出字典中所有的值
NSArray *values = dict1.allValues;
for(id value in values){
NSLog(@"%@",value);
}
6、字典与文件
1、写入文件
NSString *path = @"/Users/jinpengyao/Desktop/lala.txt";
BOOL isSuccess = [dict1 writeToFile:path atomically:YES];
if(isSuccess){
NSLog(@"写入成功");
}else{
NSLog(@"写入失败");
}
2、读取文件
NSDictionary *dict2 = [NSDictionary dictionaryWithContentsOfFile:path];
可变字典(NSMutableDictionary):它是NSDictionary的子类,它是可变的字典。它支持增删改操作。
1、创建空字典
NSMutableDictionary *mDict = [NSMutableDictionary dictionary];
mDict.dictionary = @{@"age":@10,@"name":@"wwwww",@"height":@1.8};
2、创建一个有容量的字典(可以容纳10个键值对)
NSMutableDictionary *mDict1 = [NSMutableDictionary dictionaryWithCapacity:10];
mDict1.dictionary = @{@"age":@10,@"name":@"wwwww",@"height":@1.8};
3、元素的插入
[mDict1 setObject:@50.0 forKey:@"weight"];
//等价
mDict1[@"sex"] = @"男";
4、修改
mDict1[@"age"] = @30;
5、删除
[mDict1 removeObjectForKey:@"age"];
//删除数组中key所对应的值
[mDict1 removeObjectsForKeys:@[@"name",@"sex"]];
//清空字典
[mDict1 removeAllObjects];
6、遍历的同时进行删除
1、首先找到要删除的key放在数组(需要可变数组)中
NSMutableArray *mArray = [NSMutableArray array];
for (NSString *key in mDict1) {
if([mDict1[key] isEqual:@10]){
[mArray addObject:key];
}
}
[mDict1 removeObjectsForKeys:mArray];
NSLog(@"%@",mDict1);
NSSet(无序的,元素不可以重复,可以用来快速去除数组中的重复元素,效率比数组高,一经创建就不能增删改)
1、创建
NSSet *set = [NSSet setWithObjects:@1,@2,@3,@1,nil];
2、遍历
for (NSNumber *number in set) {
NSLog(@"%@",number);
}
3、判断是否包含某个元素
BOOL isContains = [set containsObject:@1];
if(isContains){
NSLog(@"包含");
}
4、给数组去重(通过数组创建一个set,把set转换为数组)
NSArray *array = @[@1,@2,@1,@2];
NSSet *set1 = [NSSet setWithArray:array];
NSArray *array1 = [set1 allObjects];
NSMutableSet(可以增删,但是没有改操作。)
1、创建
NSMutableSet *mSet = [NSMutableSet set];
NSMutableSet *mSet1 = [NSMutableSet setWithCapacity:10];
2、赋值
NSSet *set = [NSSet setWithObjects:@1,@2,@3,@4,nil];
NSMutableSet *mSet1 = [NSMutableSet setWithCapacity:10];
mSet1.set = set;
3、添加值
[mSet1 addObject:@4];
4、删除值
[mSet1 removeObject:@1];
集合中的内存管理
MRC手动内存管理
当添加一个对象到集合中,集合就会对这个对象进行一次retain操作。
当你把它从集合中移除的时候,它会进行一次release操作。
当集合销毁的时候,会对集合中所有的元素进行一次release操作。
@autoreleasepool {
CZDog *dog = [[CZDog alloc]init];
// CZDog *dog1 = [[CZDog alloc]init];
// CZDog *dog2 = [[CZDog alloc]init];
// CZDog *dog3 = [[CZDog alloc]init];
NSMutableArray *mArray = [[NSMutableArray alloc]init];
[mArray addObject:dog];//dog = 2
// [mArray removeObject:dog];// dog = 1
NSLog(@"%zd",[dog retainCount]);
[dog release];
NSLog(@"%zd",[dog retainCount]);
[mArray release];
}
ARC自动内存管理
当你把一个对象添加到集合中,集合会对这个对象有一个强引用(指针)。
当你从集合中删除一个对象的时候,集合会释放掉对这个对象的强引用(指针)。
当数组销毁的时候,它会释放掉数组中所有的元素的强引用。
@autoreleasepool {
CZDog *dog = [[CZDog alloc]init];
NSMutableArray *array = [[NSMutableArray alloc]init];
[array addObject: dog];//增加强引用
// [array removeObject:dog];//移除强引用<注意这个地方移动要在为dog对象赋nil之前,不然释放不了。>
// array = nil;
// dog = nil;
}//因为作用域的原因,所以里面的对象被释放了
常用的结构体
1、NSRange 表示区间
NSRange range ;
range.location;//表示开始的位置
range.length;//表示长度
2、CGPoint|NSPoint 表示点
CGPoint point;
point.x;//表示x坐标
point.y;//表示y坐标
CGPoint point;
point = CGPointMake(10, 10);//快速创建一个点
NSLog(@"%@",NSStringFromPoint(point));
3、CGSize|NSSize 表示尺寸|大小
CGSize size;
size.height;//表示高度
size.width;//表示宽度
CGSize size;
size = CGSizeMake(20, 30);
NSLog(@"%@",NSStringFromSize(size));
4、CGRect|NSRect 表示位置和大小
CGRect rect;
rect.size;//表示大小
rect.origin;//表示位置
CGRect rect;
rect = CGRectMake(10, 10, 20, 30);
NSLog(@"%@",NSStringFromRect(rect));
基本数据类型的包装类(NSNumber):OC中集合类中只能存储OC对象,不能存放基本数据类型和结构体。
正:如果要存储基本数据类型,需要把基本数据类型转换成一个包装类型(NSNumber),然后存入到集合中。
反:从集合类中取出一个包装类型(NSNumber),然后把包装类型转换成基本数据类型,最后使用。
存储结构体
快速创建NSNumber的对象
number = @1;
number = @2.2;
结构体 - 》 包装类型(NSValue) - 》存入集合类
从集合中取出包装类型 - 》 包装类型(NSValue) - >结构体
(正)//基本数据类型转包装类型
NSNumber *number = [NSNumber numberWithFloat:10.1f];
number = [NSNumber numberWithInt:10];
number = [NSNumber numberWithBool:YES];
(反)//包装类型转基本数据类型
int i = number.intValue;
float f = number.floatValue;
BOOL is = number.boolValue;
//结构体转换
NSRange range = {10,20};
NSValue *value = [NSValue valueWithRange:range];
range = value.rangeValue
CGPoint point = CGPointMake(1.2, 10.2);
NSValue *value1 = [NSValue valueWithPoint:point];
poin = value.pointValue
CGSize size = CGSizeMake(10.1, 20.2);
NSValue *value2 = [NSValue valueWithSize:size];
CGRect rect = CGRectMake(10, 10, 20, 30);
NSValue *value3 = [NSValue valueWithRect:rect];
//自定义的结构体转NSValue
typedef struct {
int year;
int month;
int day;
}CZDate;
CZDate date = {2014,12,5};
NSValue *value = [NSValue valueWithBytes:&date objCType:@encode(CZDate)];
NSLog(@"%@",value);
//NSValue转换为自定义结构体
//包装类型转结构体
CZDate d1;
[value getValue:&d1];//getValue的作用,主要是把NSValue里面的值赋值到结构体中。
NSLog(@"%d,%d,%d",d1.year,d1.month,d1.day);
NSDate
//日期转字符串
NSDate *date = [NSDate date];//当前时间的对象
NSDateFormatter *formate = [[NSDateFormatter alloc]init];
formate.dateFormat =@"yyyy年MM月dd日 HH时mm分ss秒";
NSString *sDate = [formate stringFromDate:date];
NSLog(@"%@",sDate);
//字符串转日期
//注意定义的字符串要跟,字符串格式化里面设置的格式保持一致,否则会导致结果为NULL
NSString *ds = @"1991年1月1日 10时10分10秒";
NSDate *date1 = [formate dateFromString:ds];
NSLog(@"%@",date1);
//两个日期的比较
NSString *ds = @"2015-1-1 10:10:10";
NSString *ds1 = @"2015-10-1 10:10:10";
NSDateFormatter *formate = [[NSDateFormatter alloc]init];
formate.dateFormat = @"yyyy-MM-dd HH:mm:ss";
NSDate *d1 = [formate dateFromString:ds];
NSDate *d2 = [formate dateFromString:ds1];
BOOL isSame = [d1 isEqualToDate:d2];
if(isSame){
NSLog(@"日期相同");
}
//比较两个日期
NSComparisonResult rs = [d1 compare: d2];
if(rs == NSOrderedSame){
NSLog(@"日期相同");
}else if(rs == NSOrderedAscending){
NSLog(@"d1 < d2");
}else{
NSLog(@"d1 > d2");
}
//获取两个日期中较早的一个
NSDate *earlyDate = [d1 earlierDate: d2];
NSLog(@"%@",earlyDate);
//获取两个日期中较晚的一个
NSDate *lateDate = [d1 laterDate: d2];
NSLog(@"%@",lateDate);
//创建一个较晚的时间(创建明天的时间)
int second = 60*60*24;
NSDate *tomorrow = [NSDate dateWithTimeIntervalSinceNow:second];
NSLog(@"%@",tomorrow);
NSCalendar 日历,主要用于日期的计算
//获取日历的每一个部分
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *date = [NSDate date];
NSDateComponents *cmps = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond fromDate:date];
long year =cmps.year;
NSLog(@"%zd年,%zd月,%zd日,%zd时,%zd分,%zd秒,",year,cmps.month,cmps.day,cmps.hour,cmps.minute,cmps.second);
//比较两个日期(计算两个日期之间的差值)
NSString *ds = @"2015-1-1 10:10:10";
NSString *ds1 = @"2015-10-1 10:10:10";
NSDateFormatter *formate = [[NSDateFormatter alloc]init];
formate.dateFormat = @"yyyy-MM-dd HH:mm:ss";
//将字符串转换为日期
NSDate *d1 = [formate dateFromString:ds];
NSDate *d2 = [formate dateFromString:ds1];
NSDateComponents *cmps1 = [calendar components:NSCalendarUnitMonth fromDate:d1 toDate:d2 options:NSCalendarMatchStrictly];
NSLog(@"%zd",cmps1.month);
//NSDateComponents转NSDate
NSDate *dateNS = [calendar dateFromComponents:cmps];
NSLog(@"%@",dateNS);
文件操作
文件管理器:(它是一个单例类,用于操作文件相关操作)
NSFileManager 单例对象
1、判断某一个路径下的文件是否存在
NSFileManager *manager = [NSFileManager defaultManager];
NSString *path = @"/Users/jinpengyao/Desktop/屏幕快照 2014-12-05 下午3.42.48.png";
//即可以判断文件也可以判断文件夹
BOOL isExists = [manager fileExistsAtPath:path];
if(isExists){
NSLog(@"存在");
}
2、判断是文件还是文件夹
BOOL isDirector = NO;//当时文件夹的时候为1,不是文件夹的时候为0
//判断是否为文件夹
isExists= [manager fileExistsAtPath:path isDirectory:&isDirector];
//只有存在isDirector才会有意义
if(isExists){
NSLog(@"文件夹存在,%d",isDirector);
}else{
NSLog(@"不存在,%d",isDirector);
}
3、判断文件权限
BOOL isReadable = [manager isReadableFileAtPath:path];
if(isReadable){
NSLog(@"可读");
}
BOOL isWritable = [manager isWritableFileAtPath:path];
if(isWritable){
NSLog(@"可写");
}
4、获取文件或文件夹的属性
NSDictionary *attr = [manager attributesOfItemAtPath:path error:&error];
if(!error){
NSLog(@"%@",attr);
}
5、获取文件或文件夹的大小
NSNumber *size = attr[@"NSFileSize"];
//等价于
size = attr[NSFileSize];
6、拷贝文件 (可以是文件也可以是文件夹)
NSError *error1 = nil;
NSString *dest = @"/Users/jinpengyao/Desktop/1.txt";
BOOL isSuccess = [manager copyItemAtPath:path toPath:dest error:&error1];
if(isSuccess){
NSLog(@"拷贝成功");
}
7、移动文件/剪切
NSError *error1 = nil;
NSString *dest = @"/Users/jinpengyao/Desktop/1.txt";
BOOL isSuccess = [manager copyItemAtPath:path toPath:dest error:&error1];
if(isSuccess){
NSLog(@"拷贝成功");
}
NSString *dest1 = @"/Users/jinpengyao/Desktop/2.txt";
BOOL isSuccess1 = [manager moveItemAtPath:dest toPath:dest1 error:&error1];
if(isSuccess1){
NSLog(@"剪切成功");
}
8、创建目录
NSFileManager *manager = [NSFileManager defaultManager];
NSError *error = nil;
NSString *path = @"/Users/jinpengyao/Desktop/haha/lala";
//withIntermediateDirectories表示中间目录要不要创建
//这个方法只能创建文件夹,不能创建文件
BOOL isSuccess = [manager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:&error];
if(isSuccess){
NSLog(@"创建成功");
}else{
NSLog(@"%@",error);
}
NSData
1、创建文件
NSFileManager *manager = [NSFileManager defaultManager];
NSString *file = @"/Users/jinpengyao/Desktop/lala.txt";
NSString *str = @"今天oc最后一天了";
//NSData OC中用于保存二进制数据的,对于图片、视频这些类型的文件只能使用NSData来保存
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
BOOL isSuccess = [manager createFileAtPath:file contents:data attributes:nil];
if(isSuccess){
NSLog(@"文件创建成功");
}else{
NSLog(@"创建失败");
}
2、文件的操作(拷贝)
NSFileManager *manager = [NSFileManager defaultManager];
//读取文件
NSData *data =[NSData dataWithContentsOfFile:@"/Users/jinpengyao/Desktop/屏幕快照 2014-12-05 下午3.42.48.png"];
//文件大小(data.length)
NSLog(@"%ld",data.length);
//数据写入文件
BOOL isSuccess = [data writeToFile:@"/Users/jinpengyao/Desktop/text.png" atomically:YES];
if(isSuccess){
NSLog(@"写入成功");
}else{
NSLog(@"写入失败");
}
NSMutableData
NSFileManager *manager = [NSFileManager defaultManager];
NSMutableData *dataM = [NSMutableData data];
NSData *d1 = [@"today is" dataUsingEncoding:NSUTF8StringEncoding];
NSData *d2 = [@" a good day" dataUsingEncoding:NSUTF8StringEncoding];
//添加数据
[dataM appendData:d1];
[dataM appendData:d2];
//把NSData转换为NSString
NSString *string = [[NSString alloc]initWithData:dataM encoding:NSUTF8StringEncoding];
NSLog(@"%@",string);
NSObject
NSObject *obj;
CZStudent *student = [[CZStudent alloc]init];
//判断它是否是一个类或其子类的对象
if([student isKindOfClass:[CZStudent class]]){
NSLog(@"是de");
}
//判断是否是本类的对象
if([student isMemberOfClass:[CZPerson class]]){
NSLog(@"是de");
}else{
NSLog(@"no的");
}
//判断它是否遵循了某一个协议
Protocol *pro = @protocol(bad);
if([student conformsToProtocol:pro]){
NSLog(@"遵守了这个协议");
}else{
NSLog(@"不遵守这个协议");
}
复制(目的:改变复制的对象不会影响被复制的对象)
不可变对象:一经创建就不可增加、删除、修改的对象。
可变对象:在原有基础上可以进行增加、删除、修改的对象。
(对于不可以变的对象,都是浅复制(浅拷贝))
浅复制:不会产生一个新对象的赋值。(对于所有的不可以变的对象进行复制都是浅复制)
NSString的copy
NSString *str = [NSString stringWithFormat:@"abc"];
//赋值对象
NSString *str1 = [str copy];
NSLog(@"%p,%p",str,str1);
NSArray的copy
NSArray *arr = [NSArray arrayWithObjects:@1,@2,@3,nil];
NSArray *arrNew = [arr copy];
NSLog(@"%p,%p",arr,arrNew);
深复制:会产生一个全新的对象(对所有的不可变对象进行mutableCopy操作的时候)
NSString的mutableCopy
NSString *str = [NSString stringWithFormat:@"abc"];
NSMutableString *str1 = [str mutableCopy];
NSLog(@"%p,%p",str,str1);
NSArray的mutableCopy
NSArray *arr = [NSArray arrayWithObjects:@1,@2,@3,nil];
NSMutableArray *arrNew = [arr mutableCopy];
NSLog(@"%p,%p",arr,arrNew);
进行copy操作返回的都是一个不可变的对象
(程序直接奔溃了)
NSString *str = [NSString stringWithFormat:@"abc"];
//赋值对象
NSMutableString *str1 = [str mutableCopy];
NSMutableString *str2 = [str1 copy];
[str2 insertString:@"a" atIndex:1];
对于可变的对象进行copy或mutableCopy操作都会产生一个全新的对象
NSArray *arr = [NSArray arrayWithObjects:@1,@2,@3,nil];
NSMutableArray *arrNew = [arr mutableCopy];
NSArray *arr2 = [arrNew mutableCopy];
NSLog(@"%p,%p,%p",arr,arrNew,arr2);
NSString *str = [NSString stringWithFormat:@"abc"];
//赋值对象
NSMutableString *str1 = [str mutableCopy];
NSMutableString *str2 = [str1 copy];
NSLog(@"%p,%p,%p",str,str1,str2);
//注意这里复制的是对象的指针,而不是产生新的狗对象。
CZDog *dog1 = [[CZDog alloc]init];
dog1.name = @"新款";
NSArray *arr = [NSArray arrayWithObject:dog1];
NSMutableArray *arrM = [arr mutableCopy];
CZDog *dog = arrM[0];
dog.name =@"good";
NSLog(@"%@,%@",dog.name,dog1.name);