OC学习笔记之foundation

Foundation框架介绍
   1.什么是框架
      由许多的类、方法、函数、文档按照一定的逻辑组织起来的集合,以便是程序开发变得更容易。在OS X下的MAC
      操作系统中大约有80个框架为所有的程序开发奠定基础的框架称为Foundation框架。
      Foundation框架允许使用一些基本对象,如数字,字符串,以及协议对象的集合,如数组,字典和集合。其他
      功能包括处理日期时间,内存管理,处理文件系统,存储(或递归)对象,处理几何数据结构
      Cocoa框架是Foundation框架和APPKit(应用开发数据包,例如地图)框架的集合
      Cocoa Touch框架是Foundation框架和UIKit(UO设计工具包)框架几何
      Foundation框架大概有125个可用的头文件,作为一个简单是形式,可以使用下面语句导入:
          #import 。因为Foundation.h文件实际上导入其他所有的Foundation框架中的头文件
   2.Foundation框架的作用
      (1)Foundation框架是Mac\IOS其他框架的基础
      (2)Foundation框架包含了很多开发中常用的数据类型:结构体、枚举、类
   3.不小心修改了系统自带的头文件,比如NSString.h,会报错、解决方案是删除Ccode缓存:
      /Users/用户名/Library/Developer/Xcode/DeriveData
     其中Library文件夹有可能是隐藏的,需要通过以下命令修改:
     显示隐藏文件:defaults write com.apple.finder AppleShowAllFiles - bool true
     隐藏隐藏文件:defaults write com.apple.finder AppleSshowAllFiles - bool false
     指令输入完成后,请重新启动Finder




NSString字符串比较
    1.字符串比较函数
       1)比较字符串的大小-----compare方法,compare返回结果三种
          str > str2                 NSOrderedDescending           1 
          str < str2                 NSOrderedAscending           -1 
          str = str2                 NSOrderedSame            0
          例子:
          NSComparisonResult result = [str compare:str2];
          可以设置比较条件:
          NSComparisonResult result = [str compare:str2 options:NSCaseInsensitiveSearch];//比较的时候不区分大小写
          NSComparisonResult result = [str compare:str2 options:NSCaseInsensitiveSearch | NSNumericSearch];//比较的时候,
              既不区分大小写,同时又要比较字符个数 
          还有一个参数NSLiteralSearch:进行完全比较,区分大小写,这也是默认情况下的方式。
      2)判断字符串是否相等
         ==不能够判断字符串相等
         NSString *str1 = @”abc“;//地址在常量区
         NSString *str2 = @”abc“;//地址在常量区
         NSString *str3 = [NSString stringWithoutFormat:@"abc"];//地址在堆区
         if(str1 == str2)//比较后结果是1,因为str1和str2比较的是地址,而在常量区同样的变量只保存一份,故而两者相同
               NSLog(@"1");
         else
               NSLog(@"0");
         if(str1 == str3)//比较结果为0,因为地址不相同
               NSLog(@"1");
         else
               NSLog(@"0");
         故这种比较方法是错误的。正确的比较方法如下:
         //使用isEqualToString,该方法的返回值为bool类型YES和NO。该方法是区分大小写的。
         if([str1 isEqualToString:str3])
     2.NSString的前后缀检查及搜索
        1)NSString的前后缀检查hasPrefix/hasSuffix
              检测前缀:
              NSString *url = @"http://www.baidu.com";
              检查输入的是不是一个网址(及是否以http开头或者https开头)
              if([url hasPrefix:@"http://"] || [url hasPrefix:@"http://"]){
                          NSLog(@"是一个网址")
              }
              else{
                          NSLog(@"不是一个网址");
              }


              检测后缀:
              判断是不是一个图片
              NSString *imgName = @"xxxxx.jpg";
              if([imgName hasSuffix:@".jpg"]){
                        NSLlog(@"是一张图片");
              }
              else{
                        NSLog(@"不是一张图片");
              }           
            2)字符串查找(某个字符串是否包含在另一个字符串中,存在于另一个字符串中的位置),
               str1 rangofString str2;//查找str2在str1中首次出现的位置,location+length.
               NSString * str1 = @"asdfqwezxcasdqwe";
               NSString * str2 = @"qwe";
               NSRange range = [str1 rangeofString:str2];
               if(range.location != NSNotFound){//如果没有查找到,返回值为long类型的最大整型数。
                NSLog(@"%lu,%lu",range.location,range.length);                
               }
               else{
                   NSLog(@"没有找到字符串");
               }
      3.NSString的其他用法
         (1)获取字符串的每个字符
              [str characterAtIndex:i];
         (2)字符串和其他字符串的转换问题
              字符串转各种数值
           NSString *str = @"1";
           NSString *str1 = @"3.14";
           int b = [str intValue];
           float a = [str1 floatValue];


           OC的字符串和C的字符串的相互转换
               C字符串转化为OC思路:
                      1)用C创建一个C语言字符串
                      2)将C创建的C字符串转化为OC中的字符串对象
                      char *s = "zhangsanfeng";
                      printf("%s",s);
                      NSString *str =[NSString stringWithUTF8String:s];
                      NSLog(@"str = %@",str);
               OC字符串转换为C字符串
                      NSString *str = @"zbz";
                      const char *s1 = [str UTF8String];


NSRange的使用
    1.NSRange是Foundation框架中比较常用的结构体,他在框架中的定义:
         typedef struct _NSRange{
               NSUInteger location;
               NSUInteger length;
         }NSRange;//NSRange用来表示事物的一个范围,通常是字符串里的字符范围或者数组里的元素范围
        例子:”I love IOS“中的IOS可以用location 7和length 3表示
    2.NSRange创建的几种方式
              (1)通过结构体变量访问成员:
                    NSRange range;//声明一个结构体变量
                    range.location = 7;//结构体变量赋值
                    range.length = 3;//结构体变量赋值
              (2)通过结构体变量整体赋值
                    NSRange range;//声明一个结构体变量
                    range = (NSRange){5,3};
              (3)声明变量的时候直接赋值
                    NSRange r3 = {5,3};
                    NSRange r4 = {.location = 3};只给结构体中的一个变量赋值
              (4)OC中新增的方法
                    NSRange r5 = NSMakeRange(3,3);
       查看结构体变量的值:
              NSLog(@"%ld,%ld",r4.location, r4.length);
       可以把结构体变量转换为NSString类型
              NSLog(@"%@",NSStringFromRange(str4));
          




字符串的截取和替换
   1.字符串的截取
       (1)substringFromIndex-------从xx位置开始,到最后结束
           NSString *str1 = @''http://www.baidu.com";
           NSString *str = [str substringFromIndex:5];//从第五个位置开始往后截取,第五位置之前的全部去掉,
                                                                          //只保留第五个及其后面的字符
       (2)substringToIndex------从开始位置开始截取,到XX位置结束
           NSString *str1 = @''http://www.baidu.com";
           NSString *str = [str substringToIndex:5];//第五位及第五位之后的字符都被丢弃
       (3)substringWithRange截取一个范围
           NSRange r1 = {3,4};
           NSString *str1 = @''http://www.baidu.com";
           NSString *str3 = [str substringWithRange:r1];//从第三个位置开始,截取四个,包括第三个位置
      练习:取中间字符
           NSString * str = @"传智播客";
           (1)取">"的第一个位置+1
               NSUInteger loc1 = [str rangeofString:@">"].location +1;
           (2)取"<"的第一个位置
               NSUInteger loc2 = [str rangeofString:@"<"].location;
           (3)求要截取字符的长度
               int len = loc2 - loc1;
           (4)构建range
               NSRange r2 = {loc1,len};               
           (5)截取
               NSString *sunStr = [str substringWithRange:r2];
    2.字符串的替换(关键字stringByReplacingOccurrencesOfString)
       -(NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *) replacement;
       //上面用replacement 替换target
       例:[str stringByReplacingOccurrencesOfString:@"a" withString:@"*"]//将字符串中的a全部用*替换




NSMutableString
   1.NSMutableString介绍和使用
      NSMutableString继承自NSString,他更加灵活。
      NSMutableString和NSString的区别:
            (1)NSString里面的文字内容是不可变的,而NSMutableString里面的参数是可变的
                //不可变:指的是字符串在内存中的存储空间固定,并且存储的内容不能发生变化
               //可变:指的是字符串在内容中占用的存储空间不固定,并且存储的内容可以被修改
                                      
            (2)使用例子
                #import
                int main(int argc, const char *argv[]){
                     autoreleasepool{
                        NSString *str = @"Jack";//字符串常量在常量区
                        NSLog(@"str addr = %p",str);//在内存中的位置是A
                        str = @"Rose";
                        NSLog(@"str addr = %p",str);//在内存中的位置是B
                        NSMutableString *str2 = [NSMutableString stringWithFormat:@"Jack"];//在堆区
                        NSLog(@"str addr = %p",str2);//内存空间为C,在堆区
                        [str2 appendString:@"Rose"];
                        NSLog(@"str addr = %p",str2)//内存空间为C,在堆区
                        NSLog(@"str addr = %@",str2);//结果是“Jack@Rose”;
                        //创建一个可变的空字符
                        NSMutableString *str3 = [NSMutableString string];
                        for(int i; i < 10; i++){
                                [str3 appendString:@"itcast"];
                        }
                        
                     }
                     return 0;
                }
     2.NSMutableString的常用方法
        (1)appendString
        (2)appendFormat//格式化的添加字符串
            NSMutableString *str = [NSMutableString string];
            [str appendFormat:@"http://www.baidu.com/%d",100];
            NSLog(@"%@",str);//输出"http://www.baidu.com/100"
        (3)deleteCharactersInRange//在字符串的指定位置删除字符串的一部分内容
            NSMutableString *str = [NSMutableString string];
            [str appendFormat:@"http://www.baidu.com/%d",100];
            NSLog(@"%@",str);
            [str deleteCharactersInRange:NSMakeRange(3,4)]//从第三个位置开始,往后删4个。并且返回值为0,
                                                                                  //因为该方法将已存在的内存缩小,地址没有改变
        (4)insertString//没有返回值
            NSMutableString *str = [NSMutableString string];
            [str appendFormat:@"http://www.baidu.com/%d",100];
            NSLog(@"%@",str);
            [str deleteCharactersInRange:NSMakeRange(3,4)]
            [str insertString:@"p://" atIndex:3];//在位置3之前插入
        (5)replaceCharactersInRange
            [str replaceCharatersInRange:NSMakeRange(11,5) wtithString:@"itcast"];
     3.注意事项
        (1)给可变字符串赋值了不可变的值,导致程序运行时出错
            NSMutableString *str = @"abc";//@“abc”是NSString类型,而str是NSMutableString类型
                                                         //编译的时候,str认为自己是NSMutableString类型,不会报错
                                                         //但是动态类型只有在运行的时候,才会确定自己是什么类型,也就是说
                                                         //运行的时候,判断自己为NSString类型
            [str appendString:@"xxxx"];
        (2)NSMutableString中string属性,该属性可以将原来的字符串覆盖。
            str.string = @" ";以空格覆盖
        (3)开发中是使用NSString还是使用NSMutableString
            绝大多数情况下,使用NSString,在需要对字符串的内容进行操作的时候,使用NSMutableString
        (4)位枚举








NSArray//OC中提供数组的一个类
     1.NSArray基础
        (1)开发中尽量使用NSArray,因为C中的数据只能存放一种类型的数据,不能很方便的动态添加元素、不能很方便的
            动态删除数组元素
        (2)只能存放对象,并且下标有序
            不能存储非OC对象,如int\float\double\char\enum\struct等
            它是不可变的,一旦初始化完毕,它里面的内容是固定的,不可修删改
     2.NSArray的创建方式
        (1)NSArray的类方法创建








     3.NSArray的常见用法
       (1)-(NSRUInteger)count方法-----获取当前数组的长度
       (2)-(id)objectAtIndex:(NSUInteger)index------获取index位置的元素
       (3)-(BOOL)containsObject:(id)anObject--------数组中是否包含某个对象
       (4)-(id)lastObject-------返回最后一个元素
       (5)-(id)firstObject-------返回第一个元素
       (6)-(NSUInteger)indexofbject:(id)anobject-----查找anobject元素在数组中的位置,如果找不到,返回-1(NSNotFound)
       (7)-(NSUInteger)indexofobject:(id)anobject inRange:(NSRange)range;----在range范围内查找anobject元素在数组中的位置


     4.NSArray的遍历方法
       (1)NSArrya下标遍历
           NSArray *arr = @[@"one",@"two",@"three",@"four"];
           for(int i=0;i                 NSLog(@"->%@",arr[i]);
           }
       (2)快速枚举法(for循环的增强方式forin)
           for(NSString * int arr){
                NSLog(@"->%@",arr);
           }
       (3)使用block方法进行访问
           [arr enumerate3objectsUsingBlock:^(id obj,NSUInteger idx,BOOL *stop){
                     if(idx ==2){
                         *stop = YES;
                     }
                     else{
                          NSLog(@"idx = %ld,obj = %@",idx,obj);
                     }
           }];
    5.NSSArray和字符串之间的关系
       1.把数组元素连成一个字符串
          NSArray *arr = @[@1,@2,@3,@4];
          NSString *str = [arr componentsJoineByString:@"-"];
       2.把字符串分成若干个元素,并依次存放进入数组中
          NSString *str2 = @"400-800-1258";
          NSArray *arr2 = [str2 compontsSepatatedBystring:@"-"]
          str2 = @"400-800-1258#400-800-1257";
          NSArray *arr3 = [str2 componentsSeparatedByString:@"#"];
          NSArry *arr4 = [arr3 fistObject] componentsSeparatedByString:@"--"]
          NSArry *arr5 = [arr3 lastObject] componentsSeparatedByString:@"--"]




NSMutableArray及基本使用
   1.基本使用
     NSArray初始化之后,内容永远固定,NSMutableArray可以改变
     (1)创建
         //创建空数组
         NSMutableArray *arr1 = [NSMutableArray array];
         //创建的时候初始化一个元素
         NSMutableArray *arr2 = [NSMutableArray arrayWithObject:@"one"];
         //创建的时候,初始化多个元素
         NSMutableArray *arr3 = [NSMutableArray arrayWithObject:@"one",@3];
         //创建一个数组,并且指定其长度(该长度随着数组元素的增加是可以改变的)
          NSMutableArray *arr3 = [NSMutableArray arrayWithCapacity:5];
     (2)添加元素
         [arr1 addObject:@"fengjie"];
         还可以添加整个数组
         -(void)addObjectsFormArdObray:(NSArray *)array;
         在指定位置插入元素
         [arr1 inserObject:@"zbz" atIndex:0];
     (3)删除元素
         根据对象删除
         [arr1 removeObject:@"zbz"];
         根据位置删除
         [arr1 removeObjectAtIdex:1];
         全部删除 
         [arr1 removeAllObjects];
     (4)修改元素
         [arr3 replaceObjectAtIndex:1 withOvject:@"four"];
     (5)查找元素
         BOOL isSearch = [arr3 containObject:@"four"];
     (6)元素交换
         [arr3 exchangeObjectAtIndex:0 withObjectAtIndex:4];
   2.错误的使用
      NSMutableArray *array =@ [@"bob",@"steve",@"john"];//后面是给不可变量赋值的。




NSDictionary
   1.基本知识
      NSDictionary的意思是字典。
      NSDictionary的作用类似:通过一个key值,能找到对应的value
      NSDictionary是不可变的,一旦初始化完毕,不可修改
      字典的key值和value值都是对象
   2.创建
      //创建空字典
         NSDictionary *dict1 = [NSDictional dictionary];
         由于NSDictionary是不可变的,一旦创建不能改动,所以这样写没有意义
      //创建只有一组键值对的字典
         NDSictionary *dict2 = [NSDictionary dictionaryWithObject:@"zhangsan" forkey:@"zs"];
      //创建多组键值对的字典
          NDSictionary *dict3 = [NSDictionary dictionaryWithObjectsAndKeys:@"zhangsan" forkey:@"zs",@"lisi",@"k2",nil];//成对
                     出现,前面是value值,后面是key值。
          NSLog(@"%@",dict2);//输出结果包含扎起大括号里
      //快速创建字典
           NDSictionary *dict4 = @{@"k1":@"a", @"k2":@"b", @"k3":@"c"};
   3.键值对集合的特点
     (1)字典存储的时候,必须是以"键值对"的方式来存储,并且key值不能重复,如果重复了,后面添加的无法加入字典
     (2)键值对中存储的数据是无序的
     (3)键值对集合可以根据键值快速获取数据
   4.NSDictionary基本用法
     (1) -(NSUInteger)count------------返回字典的键值对数目
          NSLog(@"%lu",dict.count);
     (2) -(id)objectForKey:(id)akey-----------根据key值获得value值
          NSString *str = [dict objectForKey:@"k1"];
  
   5.字典的遍历
      //获取所有的key
      //根据key获取value
      方法一:
      for(NSString*key in dict){
           NSLog(@"key = %@,value=%@",key,[dict objectForKey:key]);
      }
      方法二:
      [dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop){
             NSLog(@"%@--->%@",key,ogj);
      }]
 
    6.NSDictionary的简写及文件操作
      (1)创建的简写
         一般写法[NSDictionary dictionaryWithObjectsAndKeys:@"Jack",@"男",@“sex”,nil];
         简写:@[@"Jack",@"男",@“sex”];
      (2)获取元素
          之前写法:[dict objectForKey:@"name"];
          现在:dict[@"k1"];
    7.NSDictionary的文件操作//把字典保存在文件中
       BOOL isWrite = [dict writeToFile:@"/Users/dict.plist" atomically:YES];
       is(isWrite){
            NSLog(@"写入成功");
       }
       //从文件中读取字典
      NSDictionary *readDict = [NSDictionary dictionaryWithContentsOfFile:@"/Users/zhuhouli.plist"];
      NSLog(@"readDict = %@",readDict);






















       

你可能感兴趣的:(学习)