框架: 系统或者第三方事先写好的写很牛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];