OC的Foundation框架
Foundation框架:
一:Foundation框架是Mac\iOS中其他框架的基础,内部包含了开发中常用的数据类型如:结构体、枚举和一些类
如果我们想使用Foundation框架中的功能,只要包含Foundation框架中的主头文件即可。
#import <Foundation/Foundation.h>
该框架提供了非常好用的类,都以NS开头,比如
NSString:字符串
NSArray:数组
NSDictionary:字典
NSDatte:日期
NSData:数据
NSNumber:数字
二:NSString
1,NSString的创建形式:
//------------ 第一种创建形式,最直接的形式 // 注意:这样创建的字符串存储在常量区(也就是内存只分配一次,以后要调用该字符串,直接从常量区读取 // NSString *str1 = @"你好China"; // NSString *str2 = @"你好China"; // NSLog(@"str1 = %p, str2 = %p", str1, str2); /* str1 = 0x100001040, str2 = 0x100001040 可以看到打印结果,证明这样直接创建的字符串存储在常量区 */ //------------ 第二种创建形式,格式化的方法,通过NSString类的类方法 // NSString *str1 = [NSString stringWithFormat:@"%@", @"你好China"]; // NSString *str2 = [NSString stringWithFormat:@"%@", @"你好China"]; // NSLog(@"str1 = %p, str2 = %p", str1, str2); /* str1 = 0x100109ba0, str2 = 0x100103580 可以看到这样创建的字符串地址不相同,因为类方法的本质是通过[[NSString alloc] init]创建的因此每次创建都会分配内存地址 */ //------------ 第二种创建形式,格式化的方法,通过对象方法创建 // NSString *str1 = [[NSString alloc] initWithFormat:@"%@", @"你好China"]; // NSString *str2 = [[NSString alloc] initWithFormat:@"%@", @"你好China"]; // NSLog(@"str1 = %p, str2 = %p", str1, str2); /* str1 = 0x100109bc0, str2 = 0x1001035a0 这样创建地址当然也不会相同 */
2,注意: 对于直接写的字符串比如:@“abc”,这种叫做字符串常量。
字符串常量,保存在内存的常量区。对于相同的字符串常量,常量区只保存一份。所以上面的s1和s2看似是两个变量,但实际上都是指向了常量区的同一个字符串对象。
三:字符串在文本中的读取操作
NSString读入取出字符串的操作
// 1,读出文本文件中的内容 // 第一种方式:stringWithContentsOfFile /* 参数:1,文件的全路径,OC中的File都是指文件的全路径 2, encoding:指文件读出时按什么格式的编码读取。(要想读取不出现乱码,那么写入时字符串用什么编码读取就用什么编码,一般计算机写入编码都是UTF-8 3,error:指指向对象指针的地址,如果读取失败,系统会修改error的错误信息 */ // NSError *err = nil; // NSString *text = [NSString stringWithContentsOfFile:@"/Users/ll/Desktop/text.txt" encoding:NSUTF8StringEncoding error:&err]; // if (err!=nil) { // NSLog(@"读取失败"); // NSLog(@"%@", [err localizedDescription]); // }else{ // NSLog(@"%@", text); // } // 第二种方式:stringWithContentsOfURL // NSError *err = nil; // // // 注意:1,用URLWithString读取本地文件内容的话必须加:file:// // 2,通过URLWithString这种方式创建url的时候,如果路径中有中文字符则,报错! // 3,如果路径中有中文,则使用另外一个方法来创建: // NSURL *url = [NSURL fileURLWithPath:@"/Users/ll/Desktop/资料/text.txt"]; // NSURL *url = [NSURL URLWithString:@"file:///Users/ll/Desktop/text.txt"]; // NSString *text = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&err]; // if (err!=nil) { // NSLog(@"读取失败"); // NSLog(@"%@", [err localizedDescription]); // }else{ // NSLog(@"%@", text); // } // 2,写入到文件内容 // --------------第一种方式:writeToFile /* 参数:atomically的YES表示当文件写入失败后就不创建文件 atomically的NO表示表示当文件写入失败后也可以创建文件 */ // NSString *text = @"hello0, 中国"; // NSError *err = nil; // [text writeToFile:@"/Users/ll/Desktop/text.txt" atomically:YES encoding:NSUTF8StringEncoding error:&err]; // if (err!=nil) { // NSLog(@"写入失败"); // NSLog(@"%@", [err localizedDescription]); // }else{ // NSLog(@"写入成功"); // } //--------------第二种写入方法 writeToURL // NSString *text = @"hello0, 中国"; // NSError *err = nil; // NSURL *url = [NSURL URLWithString:@"file:///Users/ll/Desktop/text.txt"]; // [text writeToURL:url atomically:YES encoding:NSUTF8StringEncoding error:&err]; // if (err!=nil) { // NSLog(@"写入失败"); // NSLog(@"%@", [err localizedDescription]); // }else{ // NSLog(@"写入成功"); // }
补充:NSURL
URL:全称是Uniform Resource Locator(统一资源定位符)
URI:全称统一资源标示符
例如:http://www.baidu.com/m/a.png;
URL——>http://www.baidu.com/m/a.png;
URI——>a.png
URL的格式:
基本URL包含协议、主机域名(ip地址)、资源路径
可以简单认为URL==协议头:// 主机名/路径
常见的URL协议头
1>http\https:超文本传输协议
2>文件传输协议
3>本地文件
这些协议都是通信协议,协议约束了通信双方必须遵守的规则,只要遵守了这个规则,双方就能识别通信。(就如同战争时期的无线电密码,只要双方约束好了密码本,就可以知道密文内容)
方法网络资源的时候中文也需要先进行url encode编码
注意::1,用URLWithString读取本地文件内容的话必须加:file://
2,通过URLWithString这种方式创建url的时候,如果路径中有中文字符则,报错!
3,如果路径中有中文,则使用另外一个方法来创建:
NSURL *url = [NSURL fileURLWithPath:@"/Users/ll/Desktop/资料/text.txt”]; 而fileURLWithPath方法中不需要加file://
四:NSString中的一些方法
1,大小写处理方法
// ============== 一:NSString大小写处理方法 // 1,大写转小写操作 // NSString *str = @"heLLo, wORld"; // str指向的字符串在常量区 // NSLog(@"str = %p", str); // str = [str lowercaseString]; // str指向的字符串在堆区 // NSLog(@"str = %p", str); // NSLog(@"%@", str); // 注意上面打印两个地址不同,说明NSString字符串是不可变字符串,对象方法返回一个新的地址 // 2,小写转大写 // NSString *str = @"heLLo, wORld"; // str = [str uppercaseString]; // NSLog(@"%@", str); // 3,首字母变大写,其他字母变小写 // NSString *str = @"heLLo, wORld"; // str = [str capitalizedString]; // NSLog(@"%@", str); // 结果:Hello, World
2:NSString的比较方法
// 1,比较两个字符串中的内容是否相同 // NSString *str1 = @"ABC"; // NSString *str2 = @"ABC"; // BOOL b = [str1 isEqualToString:str2]; // NSLog(@"%d", b); // 结果 :1; // 2,比较两个字符串的大小,注意:这个比较字符串中每一个字符的ACSII码值的大小 // NSString *str1 = @"NBA"; // NSString *str2 = @"CBA"; // NSComparisonResult result = [str1 compare:str2]; // switch (result) { // case NSOrderedAscending: // 升序 // NSLog(@"str1<str2"); // break; // case NSOrderedSame: // NSLog(@"str1=str2"); // break; // case NSOrderedDescending: // 降序 // NSLog(@"str1>str2"); // break; // } // /** // * 注意:compare方法的返回值是一个枚举类型:NSComparisonResult // 它有三个枚举值分别是:NSOrderedAscending: // 升序 // NSOrderedSame:// 相同 // NSOrderedDescending: // 降序 // */ // 3,也是比较字符串的大小,忽略字符串中的大小写进行比较: // NSString *str1 = @"NBA"; // NSString *str2 = @"nba"; // NSComparisonResult result = [str1 caseInsensitiveCompare:str2]; // switch (result) { // case NSOrderedAscending: // 升序 // NSLog(@"str1<str2"); // break; // case NSOrderedSame: // NSLog(@"str1=str2"); // break; // case NSOrderedDescending: // 降序 // NSLog(@"str1>str2"); // break; // }
3,NSString的搜索方法
// 1,检查⼀一个字符串是否以http开头 // NSString *str = @"http://www.baidu.com"; // BOOL b = [str hasPrefix:@"http"]; // NSLog(@"%d", b); // 结果:1 // 2,检查⼀一个⽂文件是否为png⽂文件 // NSString *str = @"123.png"; // BOOL b = [str hasSuffix:@"png"]; // NSLog(@"%d", b); // 结果: 1; // 3.检查⼀一个字符串⾥里边是否包含了word /** * 如果包含, 就返回aString的范围 如果不包含, NSRange的location为NSNotFound, length为0 NSRange⽤用来表⽰示事物的⼀一个范围,通常是字符串⾥里的字符范围或者数组⾥里的元素范围 NSRange是一个结构体类型内部含有两个属性值 1,location,2,length 创建NSRange常用方法 NSRange range = NSMakeRange(x,y); */ // NSString *str = @"hellowordchina"; // NSRange range = [str rangeOfString:@"word"]; // NSLog(@"%ld, %ld", range.location, range.length); // 4,反方向搜索,从后往前搜索 /** * 注意:options参数类型为一个枚举值,如果不填为0,这个参数就没有任何意义 如果想指定操作顺序等一些步骤可以选定枚举值 */ // NSString *str = @"hellowordchina"; // NSRange range = [str rangeOfString:@"word" options:NSBackwardsSearch]; // NSLog(@"%ld, %ld", range.location, range.length);
4,NSString的截取和替换
// 1,从字符串的某个位置开始截取直到字符串结束 // 注意:此方法包含指定位置 // NSString *str = @"hello china word"; // str = [str substringFromIndex:3]; // NSLog(@"%@", str); // 结果:lo china word // 2,从字符串开始都某个位置的字符串 // 注意:这个方法不包含最后指定的位置 // NSString *str = @"hello china word"; // str = [str substringToIndex:4]; // NSLog(@"%@", str); // 结果 : hell // 3,用指定字符串替换字符串中的某个字符串或字符 // NSString *str = @"this*is**apple"; // str = [str stringByReplacingOccurrencesOfString:@"*" withString:@" "]; // NSLog(@"%@", str);
5,
/** * 去除所有的空格 [str stringByReplacingOccurrencesOfString:@" " withString:@""] • 去除⾸首尾的空格 [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; 练习:去除头、尾的所有⼤大写字⺟母、⼩小写字⺟母、*号。 + (id)whitespaceCharacterSet; //去掉头尾空格 + (id)lowercaseLetterCharacterSet; // 去掉头尾的⼩小写字母 + (id)uppercaseLetterCharacterSet; //去掉头尾的⼤大写字母 + (id)characterSetWithCharactersInString:(NSString *)aString; // 去掉头尾的指定字符串 */ // 1,去除所有的空格 // NSString *str = @" hel lo "; // str = [str stringByReplacingOccurrencesOfString:@" " withString:@""]; // NSLog(@"====%@=====", str); // 2,去掉首位空格 // NSString *str = @" he l lo "; // str = [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; // NSLog(@"====%@====", str); // 去掉两端所有的小写字母 //s1 = [s1 stringByTrimmingCharactersInSet:[NSCharacterSet lowercaseLetterCharacterSet]]; // 去掉两端所有的大写字母 //s1 = [s1 stringByTrimmingCharactersInSet:[NSCharacterSet uppercaseLetterCharacterSet]]; // 去掉开头和结尾的特定的字符串 // s1 = [s1 stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"http"]];
6,NSString中的一些其他的用法
/** * 字符串转为基本数据类型 * -(double)doubleValue; // - (float)floatValue; * - (int)intValue; * - (char *)UTF8String; // 将OC中的字符串转换为C语言中的字符串在操作SQLite数据库时才会⽤用到 * - (unichar)characterAtIndex:(NSUInteger)index; // 遍历字符串中的每一个字符根据索引 * - (NSUInteger)length; // 返回字符串的长度,注意仅仅是其中的个数 * - (BOOL)isAbsolutePath; // 是否为绝对路径 * -(NSString*)lastPathComponent; // 获得最后一个目录 * -(NSString*)stringByDeletingLastPathComponent; // 删除最后⼀一个⺫⽬目录 * -(NSString*)stringByAppendingPathComponent:(NSString *)str;//在路径的后⾯面拼接⼀一个⺫⽬目录 * - (NSString *)stringByAppendingString; // 给一个字符串拼接字符串,返回一个新的字符串 * -(NSString*)pathExtension; //获得拓展名 * -(NSString*)stringByDeletingPathExtension; // 删除尾部的拓展名 * -(NSString*)stringByAppendingPathExtension:(NSString *)str; //在尾部添加⼀一个拓展名 */
五:NSMutableString和NSString的区别联系
NSMutableString是NSString得子类
NSString为不可变字符串:不可变是什么意思呢就是创建字符串后不能再给这个字符串添加内容
而实际中我们看到的只不过是指向常量区的指针重新指向了一个新的字符串空间而已。
//================ NSMutableString的用法 // 1,创建NSMutableString,是可变字符串 NSMutableString *strM = [NSMutableString string]; NSLog(@"strM = %p", strM); // 结果: 0x10010b030 // 2,拼接字符串到最后面 [strM appendString:@"hello china"]; [strM appendString:@" world "]; NSLog(@"strM = %p, strM = %@", strM, strM); // 结果地址 0x10010b030 /** * 注意:上面创建的strM的地址相同,说明NSMutalbeString是一个可变字符串 * 而NSString是一个不可变字符串,它会将创建的对象的地址重新赋值给str */ // 3,拼接一段格式化字符串,当然也是拼接到后面 [strM appendFormat:@"%d", 2014]; NSLog(@"strM = %@", strM); // 结果 strM = hello china world 2014 // 4, 删除 删除range范围内的字符串。一般可以配合rangeOfString删除。 NSRange range1 = NSMakeRange(3, 4); [strM deleteCharactersInRange:range1]; NSLog(@"%@", strM); // 结果 helhina world 2014 // 5,插入 在指定位置插入字符串 [strM insertString:@"你好" atIndex:3]; NSLog(@"strM = %@", strM); // 结果 strM = hel你好hina world 2014 // 6,替换 用字符串替换原字符串指定范围内字符串 NSRange range = NSMakeRange(3, 2); [strM replaceCharactersInRange:range withString:@"lo c"]; NSLog(@"strM = %@", strM); // 结果 strM = hello china world 2014 // 7,注意点 strM.string = @"哈哈"; NSLog(@"strM = %@", strM); // 结果:strM = 哈哈 /** * 原因:因为@“哈哈" 这样创建的字符串是一个不可变字符串,会把strM中的覆盖掉 NSMutableString *s1M = @"hello world"; [s1M appendString:@"你好,世界!"]; // 错误,因为实际上s1M是一个NSString类型,NSString类型是没appendString方法的。 NSLog(@"%@", s1M); */
注意点:
NSMutableString *s1M = @"hello world"; [s1M appendString:@"你好,世界!"]; // 错误,因为实际上s1M是一个NSString类型,NSString类型是没appendString方法的。