Foundation框架(下)

集合类(注意在基本数据类型前加上@相当于转换为对象)

 

    字典(它是一个无序的集合,它是通过键值对的方式来存储数据的。)字典中所有的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]);

                 }

            4block的方式

                 [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;

         }//因为作用域的原因,所以里面的对象被释放了


常用的结构体

    1NSRange 表示区间

         NSRange range ;

         range.location;//表示开始的位置

         range.length;//表示长度

 

    2CGPoint|NSPoint 表示点

         CGPoint point;

         point.x;//表示x坐标

         point.y;//表示y坐标

 

         CGPoint point;

         point = CGPointMake(10, 10);//快速创建一个点

         NSLog(@"%@",NSStringFromPoint(point));

 

    3CGSize|NSSize 表示尺寸|大小

         CGSize size;

         size.height;//表示高度

         size.width;//表示宽度

 

         CGSize size;

         size = CGSizeMake(20, 30);

         NSLog(@"%@",NSStringFromSize(size));

 

    4CGRect|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 =@"yyyyMMdd HHmmss";

        NSString *sDate = [formate stringFromDate:date];

        NSLog(@"%@",sDate);

 

    //字符串转日期

        //注意定义的字符串要跟,字符串格式化里面设置的格式保持一致,否则会导致结果为NULL

        NSString  *ds = @"199111 101010";

        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);

         

     //NSDateComponentsNSDate

         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(@"不遵守这个协议");

         }

 


    

    复制(目的:改变复制的对象不会影响被复制的对象)

        不可变对象:一经创建就不可增加、删除、修改的对象。

        可变对象:在原有基础上可以进行增加、删除、修改的对象。

    (对于不可以变的对象,都是浅复制(浅拷贝))

    浅复制:不会产生一个新对象的赋值。(对于所有的不可以变的对象进行复制都是浅复制)

        NSStringcopy

             NSString *str = [NSString stringWithFormat:@"abc"];

             //赋值对象

             NSString *str1 = [str copy];

             NSLog(@"%p,%p",str,str1);

        

        NSArraycopy

             NSArray *arr = [NSArray arrayWithObjects:@1,@2,@3,nil];

             NSArray *arrNew = [arr copy];

             NSLog(@"%p,%p",arr,arrNew);

 

    深复制:会产生一个全新的对象(对所有的不可变对象进行mutableCopy操作的时候)

         NSStringmutableCopy

             NSString *str = [NSString stringWithFormat:@"abc"];

             NSMutableString *str1 = [str mutableCopy];

             NSLog(@"%p,%p",str,str1);

 

         NSArraymutableCopy

             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];

 

    对于可变的对象进行copymutableCopy操作都会产生一个全新的对象

             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);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值