一、
-
框架: 系统或者第三方事先写好的写很牛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类型的,要打印的话使用%CNSString *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];
- (BOOL) writeToFile:(NSString *)path atomically:(BOOL)userAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error;
-
使用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写内容要有权限.
- (nullable instancetype)stringWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error:(NSError **)error;
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];
- 将不同类型的地址封装在NSURL对象中
-
字符串比较
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;
- (NSString *)substringFromIndex(NSUIntege)from;
-
字符串替换
1).- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement;
将字符串中第一个参数替换为第二个参数,原来的指针指向的内容是不会变的,新串是以方法的返回值返回的.
NSString *str = @"背景连锁酒店分开计算懒死了"; NSString *newStr = [str stringByReplacingOccurrencesOfString:@"背景" withString:@"广州"];
- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement;
-
字符串数据转换为其他类型
@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 }];
- (void) enumerateObjectsUsingBlock:(void (^)OjbectType obj, NSUInteger idx, BOOL *stop))block;
- 使用block遍历
-
NSArray和NSString
1). 将数组中元素连接起来组成一个新的字符串- (NSString *)componentsJoinedByString:(NSString *)separator
参数: 连接符
NSArray *arr = @[@"jack", @"rose", @"lili"]; NSString *str = [arr componentsJoinedByString:@"#"];
2). 将字符串按指定分隔符分割
NSString *str = @"北京,昌平区,传智"; // 使用字符串进行分割 NSArray *arr = [str componentsSeparatedByString:","];
- (NSString *)componentsJoinedByString:(NSString *)separator
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;