Objective-C 学习第九天
一、 框架: 系统或者第三方事先写好的写很牛X功能的类,把这些类交给我们使用,这些类的集合就叫框架. Foundation框架: 是一个包,有很多类和函数,定义了一些数据类型.这个框架中的类都是一些最基础的类.其他的框架都是基于Foundation框架的. UIKit. AVFoundation. ...... NSString 1). NSString是一个数据类型,保存OC字符串. NSString的本质是一个类. 最标准的创建NSString对象的方法:NSString *str1 = [NSString new]; NSString *str2 = [[NSString alloc] init]; NSString *str3 = [NSString string]; 使用这种方式创建的字符串是一个空的字符. @"" NSString 对象是用来存储字符串的. 2). NSString是OC中最常用的一个类,所以OC提供了一种更为快速的创建字符串对象的方式. 使用前缀@ @"jack": 本质是一个NSString对象,存储的是"jack"这个字符串 NSString *str1 = @"rose"; a. @"rose"本质是一个NSString对象,存储的是字符串"rose" b. 将这个字符串对象的地址返回赋值给str1指针 格式控制符%p: 打印指针变量的值,打印地址 格式控制符%@: 打印指针指向的对象 NSString对象的恒定性 1). 当我们使用简要的创建字符串对象的时候,也就是使用OC字符串常量来初始化字符串指针的时候,这个字符串对象是存储在常量区的. NSString *str = @"jack"; 当我们调用NSString的类方法来创建对象的时候, 创建的对象是存储在堆区的. NSString *str = [NSString stringWithFormat:@"jack"]; NSString *str = [NSString new]; 2). 恒定性 当在内存中创建一个字符串对象后,这个字符串对象的内容就无法更改. 当我们重新为字符串指针初始化值的时候,并不是修改原来的字符串对象,而是重新的创建一个字符串对象,将这个字符串对象的地址重新赋值给字符串指针变量. 3). 当系统准备要在内存中创建字符串对象的时候,会先检查内存中是否有相同内容的字符串对象,如果有直接指向,如果没有才会重新创建. 4). 存储在常量区的数据不会被回收,所以存储在常量区的字符串也不会被回收. NSString类中使用频率最高的方法 1). 使用拼接的方式创建一个NSString对象 + (instancetype)stringWithFormat:(NSString *)format,... int age = 10; NSString *str = @"jack"; NSString *newStr = [NSString stringWithFormat:@"大家好,我叫%@,今年%d岁",str,age]; 2). 得到字符串的长度 @property (readonly) NSUInteger length; NSString *str = @"jack"; NSUInteger len = str.length; 3). 得到字符串当中指定下标的字符 - (unichar)characterAtIndex:(NSUInteger)index; 返回值是unichar类型的,要打印的话使用%C NSString *str = @"jack"; unichar ch = [str characterAtIndex:2]; NSLog(@"ch = %C", ch); 4). 判断两个字符串的内容是否相等 a. 不能使用==来判断OC字符串的内容是否相同 b. == 运算符的作用: 比较左右两边的数据是否相同. c. 所以如果我们要比较两个OC字符串的内容是否相同,不能使用==去比较.因为==比较的是字符串指针变量的值,而我们比较的是字符串的内容 - (BOOL)isEqualToString:(NSString *) aString; 可以比较字符串的内容 NSString *str1 = @"jack"; NSString *str2 = @"jack"; [str1 isEqualToString:str2]; 5). 将C语言的字符串转换为OC字符串 + (instancetype)stringWithUTF8String:(NSString *)string; char *str = "jack"; NSString *str1 = [NSString stringWithUTF8String: str]; 6). 将OC字符串转换为C语言字符串 @property (nullable, readonly) __strong const char *UTF8String; NSString *str = @"jack"; const char *str1 = str.UTF*String; 字符串读写 1). 将一个字符串写入到磁盘上的某一个文件 (BOOL) writeToFile:(NSString *)path atomically:(BOOL)userAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error; 参数1: 将字符串内容写入到哪一个文件之中,写上文件的路径. 参数2: YES,先将内容写入到一个临时文件,如果成功过再搬到指定的目录; NO,直接将内容写入到指定的文件,不安全,效率高 参数3: 指定写入的时候的编码.一般情况下使用UTF8. NSUTF8StringEncoding 参数4: 二级指针,要传递一个NSError指针的地址.如果写入成功,这个指针的值就是nil,如果失败,这个指针就会指向一个错误对象,这个对象描述了发生错误的信息. err.localizedDescription中存储发生错误的信息 返回值是BOOL类型,代表是否写入成功. NSString *str = @"jack"; NSError *err; [str writeToFile:@"/Users/Itcast/Desktop/abc.txt", atomically:NO encoding:NSUTF8StringEncoding error:&err]; 2). 从磁盘文件读取内容 (instancetype) stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error; 参数1:文件的路径 参数2:使用的编码NSUTF8StringEncoding 参数3:错误对象 NSError *err; [NSString stringWithContentsOfFile:@"/Users/Itcast/Desktop/abc.txt" encoding:NSUTF8StringEncoding error:&err]; 使用URL来读写字符串数据. 1). 优势: 皆可以读取本地磁盘文件,还可以读写网页文件、ftp服务器文件 2). 不同类型的URL地址的写法 a. 本地磁盘文件: file://+路径---->file:///Users/Itcast/Desktop/abc.txt b. 网页地址: http://www.baidu.com/ c. ftp服务器文件的地址: ftp://server.itcast.cn/1.txt 将不同类型的地址封装在NSURL对象中 a. 从指定资源路径读取文本内容 (nullable instancetype)stringWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error:(NSError **)error; b. 将字符串的内容写入到资源路径中 (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error; c. 如果要向网页或者ftp写内容要有权限. NSURL *u1 = [NSURL URLWithString:@"http://www.itcast.cn"]; NSString *str = [NSString stringWithContentsOfURL:u1 encoding:NSUTF8StringEncoding error:nil]; NSURL *u1 = [NSURL URLWithString:@"file:///Users/Itcast/Desktop/abc.txt"]; NSString *str = @"hehehe"; BOOL res = [str writeToURL:u1 atomically:NO encoding:NSUTF8StringEncoding error:nil]; 字符串比较 1). 不忽略大小写 (NSComparisonResult)compare:(NSString *)string; NSString *str1 = @"hehehe"; NSString *str2 = @"jack"; NSComparisonResult res = [str compare:str2]; swith(res){ case NSOrderedAscending://str1小 break; case NSOrderedSame://一样大 break; case NSOrderedDescending://str2小 break; default: break; } 2). 忽略大小写 NSString *str1 = @"hehehe"; NSString *str2 = @"JACK"; NSComparisonResult res = [str compare:str2 option:NSCaseInsensitiveSearch]; swith(res){ case NSOrderedAscending://str1小 break; case NSOrderedSame://一样大 break; case NSOrderedDescending://str2小 break; default: break; } 3). 比较字符串中的数字 NSString *str1 = @"hehehe001"; NSString *str2 = @"hehehe002"; NSComparisonResult res = [str compare:str2 option:NSNumericSearch];// 只能比格式固定的 swith(res){ case NSOrderedAscending://str1小 break; case NSOrderedSame://一样大 break; case NSOrderedDescending://str2小 break; default: break; } 4). 判断是否以某个字符串开头 NSString *str = @"http://www.baidu.com/"; BOOL res = [str hasPrefix:@"http://"]; 5). 判断是否以某个字符串结束 NSString *str = @"/Users/Apple/Music/我们不一样.mp3"; BOOL res = [str hasSuffix:@".mp3"]; 在主串中搜索子串 1). 从前往后 - (NSRange) rangeOfString:(NSString *)searchString; 返回值NSRange类型的结构体变量typedef struct _NSRange{ NSUInteger location;//代表子串在主串出现的下标 NSUInteger length;//代表子串在主串中匹配的长度 } NSRange;NSString *str = @"i love itcast!"; // 在str字符串中搜索@"love"出现的范围 NSRange range = [str rangeOfString:@"love"]; if(range.location==NSNotFound){ // 没有找到 } else { // 找到了 } 或者 if(range.length==0){ // 没有找到 } else { // 找到了 } 2). 从后往前NSString *str = @"i love itcast love!"; // 在str字符串中搜索@"love"出现的范围 NSRange range = [str rangeOfString:@"love" options: NSBackwardsSearch] NSRange结构体 1). 是Foundation框架中定义的一个结构体typedef struct _NSRange{ NSUInteger location;//代表子串在主串出现的下标 NSUInteger length;//代表子串在主串中匹配的长度 } NSRange; NSRange range; // 这个结构体变量一般情况下用来表示一段范围,特别用在子串在主串中的范围. 2). 声明并初始化结构体变量的方式 a. 最原始的方式NSRange range; range.location = 3; range.length = 4; b. 第二种方式: NSRange range = {3, 7}; c. 第三种方式: NSRange range = {.location = 3, .length=7}; d. Foundation框架中定义了一个函数,这个函数可以快速的创建一个NSRange结构体. NSMakeRange(loc, len);返回一个指定属性的NSRange结构体变量 NSRange range = NSMakeRange(3,7); 5. 可以将NSRange结构体变量转换为NSString. NSRange range = NSMakeRange(3,7); NSString *str = NSStringFromRange(range); 字符串截取 1). 取到字符串中的一部分 (NSString *)substringFromIndex(NSUIntege)from; 从指定的下标处一直截取到最后 NSString *str = @"背景连锁酒店分开计算懒死了"; NSString *newStr = [str substringFromIndex:3]; 2). 从第0个开始截取指定的个数 (NSString *)substringToIndex(NSUIntege)to; 3). 从指定位置截取指定长度的字符串 (NSString *)substringWithRange(NSRange)range; 字符串替换 1). (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement; 将字符串中第一个参数替换为第二个参数,原来的指针指向的内容是不会变的,新串是以方法的返回值返回的. NSString *str = @"背景连锁酒店分开计算懒死了"; NSString *newStr = [str stringByReplacingOccurrencesOfString:@"背景" withString:@"广州"]; 字符串数据转换为其他类型 @property (readonly)double doubleValue; @property (readonly)float floatValue; @property (readonly)int intValue; @property (readonly)NSUINteger integerValue; @property (readonly)long long longLongValue; @property (readonly)BOOL boolValue; 转换注意: 其他 1). 去掉字符串前后的空格 NSString *str = @" Jack "; [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; 2). 将字符串转换为大写或者小写 NSString *str = @" Jack "; [str uppercaseString]; [str lowercaseString]; 二、 NSMutableString 1). 是Foundation框架中的一个类,从NSString继承,是用来存储字符串数据的. 2). NSMutableString在父类NSString的基础之上做扩展,存储在NSMutableString对象中的数据具有可变性,不会新创建对象. NSMutableString的用法 1). 创建对象 NSMutableString *str = [NSMutableString string]; [str appendString:@"jack"]; 2). 往可变字符串对象中追加字符串 (void)appendString:(NSString *)aString;// 直接追加内容 (void)appendFormat:(NSString *)format...;// 以拼接的方式往可变字符串对象中追加内容 3). 创建NSMutableString对象时,不能使用如下方式: NSMutableString *str = @"jack"; 4). NSMutableString做大批量的字符串拼接,速度快,因为NSMutableString只有一个,每次修改的时候直接修改对象的内容 使用建议 1). 平时使用,还是使用NSString,因为效率高 2). 大批量的数据拼接的时候使用NSMutableString 10次以上使用NSMutableString. NSArray 1). 是Foundation框架中的一个类,用来存储多个数据,具备数组功能,所以NSArray是OC中的数组 2). 特点: a. 只能存储OC对象 b. 长度固定,一旦NSArray数组创建完毕之后,元素的长度固定,无法新增、删除元素. c. 每一个元素都是紧密相连的,每一个元素仍然有自己的下标. d. 元素的类型是id类型的 3). NSArray数组的创建 1). 因为是一个类,所以就是创建NSArray对象.NSArray *arr1 = [NSArray new]; NSArray *arr2 = [[NSArray alloc] init]; NSArray *arr3 = [NSArray array]; 这样创建出来的NSArray数组的元素的个数是0个,因为长度固定,所以没有任何意义. 2). 创建数组的同时指定一个数组的元素,仍然没有意义NSArray *arr1 = [NSArray arrayWithObject:@"jack"]; 3). 最常用创建NSArray数组的方式. + (instancetype)arrayWithObjects:(ObjectType)firstObj,...NSArray *arr1 = [NSArray arrayWithObjects:@"jack",@"rose",@"lili",nil]; 4). 创建NSArray简要方式 NSArray *arr = @[@"jack", @"rose", @"lili"]; 5). 使用注意 a. 只能存储OC对象,不能存储非OC对象 b. 将元素写完之后,最后要写一个nil,表示元素到此结束了 NSArray数组的编译 1). for循环 原理: 将下标挨个遍历出来 NSArray *arr = @[@"jack",@"rose"]; for(int i=0;i<arr.count;i++){ //NSLog(@"%@",arr[i]); NSLog(@"%@", [arr objectAtIndex:i]); } 2). 使用增强for循环 a. 语法格式: for(元素类型 变量名 in 数组名){ 直接通过变量名拿到数组中的每一个元素 }NSArray *arr = @[@"jack",@"rose"]; for(NSString *str in arr){ NSLog(@"%@", str); } b. 声明在for()中的变量叫做迭代变量 c. 执行变量 将数组中的第一个元素的值赋值给迭代变量,执行循环体 ... 结束循环 d. 语法总结 -> 迭代变量的类型和数组中的元素的类型保持一致 -> 迭代变量的名称可以任意取 -> in是固定的 -> 遍历那个数组就将数组写在in后面 -> 循环体里面,迭代变量的值就是元素的值 当NSArray数组中存储的数据类型不一致的时候,迭代变量的类型建议使用id类型 使用block遍历 (void) enumerateObjectsUsingBlock:(void (^)OjbectType obj, NSUInteger idx, BOOL *stop))block; 这是一个方法,这个方法作用来遍历数组中的每一个元素 NSArray *arr = @[@"jack",@"rose"]; // 将arr数组中的每一个元素遍历出来 [arr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop){ NSLog(@"%@", obj); // 如果想停止循环,就将*stop设置为YES }]; NSArray和NSString 1). 将数组中元素连接起来组成一个新的字符串 (NSString *)componentsJoinedByString:(NSString *)separator 参数: 连接符 NSArray *arr = @[@"jack", @"rose", @"lili"]; NSString *str = [arr componentsJoinedByString:@"#"]; 2). 将字符串按指定分隔符分割 NSString *str = @"北京,昌平区,传智"; // 使用字符串进行分割 NSArray *arr = [str componentsSeparatedByString:","]; NSMutableArray是NSArray的子类 1). NSMutableArray仍然是一个数组,就被NSArray的特点,只能存储OC对象,每一个元素是紧密相连的。 2). NSMutableArray相对于父类做的扩展,NSMutableArray数组的元素可以动态的新增和删除,其他用法与NSArray一致。 所以: NSArray数组一旦创建,其元素的个数就固定,无法新增与删除 NSMutableArray数组,可以新增删除 3). NSMutableArray数组的创建NSMutableArray *arr1 = [NSMutableArray new]; NSMutableArray *arr2 = [[NSMutableArray alloc] init]; NSMutableArray *arr3 = [NSMutableArray array]; 这样创建出来的数组对象,数组的元素是0,但是有意义,可以动态的新增,删除. 最容易犯错:这样写不可以 NSMutableArray *arr1 = @[@"jack", @"rose", @"lili"]; 新增与删除 新增 a. // 将传入的参数作为数组的元素添加进去 - (void)addObject:(ObjectType)anObject; // 将另外一个数组中的每一个元素添加到可变数组中 - (void)addObjectsFromArray:(NSArray<ObjectType> *)otherArray;NSMutableArray *arr1 = [NSMutableArray new]; [arr1 addObject:@"jack"]; NSArray *arr = @[@"jack", @"rose", @"lili"]; [arr1 addObjectsFromArray:arr]; b. 在可变数组中指定的数组中插入一个元素 - (void)insertObject:(ObjectType)anObject atIndex:(NSUInteger)index;[arr insertObject:@"lilei", anIndex:1]; 删除 a. 删除 // 删除指定下标的元素 - (void) removeObjectAtIndex:(NSUInteger)index;NSMutableArray *arr1 = [NSMutableArray new]; [arr1 addObject:@"jack"]; NSArray *arr = @[@"jack", @"rose", @"lili"]; [arr1 addObjectsFromArray:arr]; [arr removeObjectAtIndex:1]; b. 删除特定的元素 - (void)removeObject:(ObjectType)anObject;NSMutableArray *arr1 = [NSMutableArray new]; [arr1 addObject:@"jack"]; NSArray *arr = @[@"jack", @"rose", @"lili"]; [arr1 addObjectsFromArray:arr]; [arr removeObject:@"lili"]; c. 删除指定范围内的元素 - (void)removeObject:(ObjectType)anObject inRange:(NSRange)range;NSMutableArray *arr1 = [NSMutableArray new]; [arr1 addObject:@"jack"]; NSArray *arr = @[@"jack", @"rose", @"lili"]; [arr1 addObjectsFromArray:arr]; [arr removeObject:@"lili" inRange:NSMakeRange(0, 3)]; d. 删除最后一个元素 - (void)removeLastObject;NSMutableArray *arr1 = [NSMutableArray new]; [arr1 addObject:@"jack"]; NSArray *arr = @[@"jack", @"rose", @"lili"]; [arr1 addObjectsFromArray:arr]; [arr removeLastObject]; e. 删除所有 - (void)removeAllObjects;NSMutableArray *arr1 = [NSMutableArray new]; [arr1 addObject:@"jack"]; NSArray *arr = @[@"jack", @"rose", @"lili"]; [arr1 addObjectsFromArray:arr]; [arr removeAllObjects]; NSNumber 1). 作用: 包装基本数据类型 NSNumber *number = [NSNumber numberWithInt:10]; 等价于 NSNumber *number = @10;