Foundation框架
NSString 是一个不可变得字符串,它的所有产生其他字符串方法都是生成一个新的字符串。
字符串的创建
1、字面量(常量字符串地址是相同的,它们就是同一个)它存储在常量区中
NSString *str = @"saas";
NSString *str1 = @"saas"
2、快捷的构造方法(存在堆里面) 第二种的运行效率比第三种运行效率高
NSString *str = [NSString stringWithFormat:@"dsa%d",10];
3、初始化方法(存放在堆里面)
NSString *str = [[NSString alloc]initWithFormat:@"adsas%d",10];
字符串的获取
1、获取字符的长度
NSString *str = @"dasddas";
long length = [str length];
2、获取子串
NSString *str = @"dasddas";
NSString *str1 = [str substringFromIndex:3];//从第三个位置开始截取,包含索引的位置。下标是从0开始
NSString *str1 = [str substringToIndex:3];//从第0个位置开始截取,到索引的位置结束。但不包含第索引的位置,下标是从0开始。
NSRange range = NSMakeRange(2, 4);
NSString *str1 = [str substringWithRange:range];//从第2个字符串的位置开始截,一共截4个字符。
NSLog(@"%@",str1);
3、获取某个子串所在父串的区间
NSRange range = [str rangeOfString:@"dd"];
if(range.location == NSNotFound){
NSLog(@"字符串中没有这个子串");
}
NSLog(@"%@",NSStringFromRange(range));
4、截取字符串
NSString *str1 = @"<itheima>IT黑马</itheima>";
NSRange range = [str1 rangeOfString:@">"];//只会与第一个匹配
NSString *str2 = [str1 substringFromIndex:range.location+1];
NSLog(@"%@",str2);
NSRange range1 = [str2 rangeOfString:@"<"];
NSString *str3 = [str2 substringToIndex:range1.location];
NSLog(@"%@",str3);
5、截取单个字符
NSString *str = @"wsajkl";
unichar c = [str characterAtIndex:2];
NSLog(@"%c",c);
6、字符串的判断
NSString *str1 = @"abc";
NSString *str2 = @"abc";
if(str1 == str2){// == 是比较地址 | equal比较的是值
NSLog(@"相等了");
}
NSString *str3 = [NSString stringWithFormat:@"abc"];
if(str1 == str3){// == 是比较地址 | equal比较的是值
NSLog(@"相等了");
}else{
NSLog(@"看到了没?");
}
if([str1 isEqualToString:str3]){// == 是比较地址 | equal比较的是值
NSLog(@"相等了");
}else{
NSLog(@"看到了没?");
}
7、自定义一个比较字符串的方法
.m
@implementation NSString (NSString_CZ)
- (BOOL)myIsEqual:(NSString *)other{
//判断是否是同一个字符串
if(self == other){
return YES;
}
//如果长度不同,则内容肯定不同
if(self.length != other.length){
return NO;
}
//一个一个进行比较
for(int i = 0 ; i < self.length ; i++){
unichar c = [self characterAtIndex:i];
unichar otherC = [other characterAtIndex:i];
if(c != otherC){
return NO;
}
}
return NO;
}
@end
.h
@interface NSString (NSString_CZ)
- (BOOL)myIsEqual:(NSString *)other;
@end
main.m
NSString *str = @"hahahaha";
NSString *str1 = @"hahahaha";
if([str myIsEqual:str1]){
NSLog(@"哈哈相等了");
}else{
NSLog(@"我擦么相等");
}
8、判断前缀
BOOL isHttp = [str hasPrefix:@"http://"];
9、判断后缀
BOOL isPng = [str hasSuffix:@".png"];
10、compare的用法(主要用在排序中)
NSString *str = @"hahahaha";
NSString *str1 = @"hahahaha";
NSComparisonResult result = [str compare:str1];
// NSOrderedAscending = -1L, str < str1
// NSOrderedSame, str == str1
// NSOrderedDescending, str > str1
if(result ==NSOrderedSame){
NSLog(@"str == str1");
}else if(result == NSOrderedDescending){
NSLog(@"str < str1");
}else{
NSLog(@"str > str1");
}
///
NSString *str = @"hahahaha";
NSString *str1 = @"hahahaha";
NSComparisonResult result = [str compare:str1 options:NSCaseInsensitiveSearch];
// NSCaseInsensitiveSearch = 1, //忽略大小写
// NSLiteralSearch = 2,
// NSBackwardsSearch = 4,
// NSAnchoredSearch = 8,
// NSNumericSearch = 64, //用于数值类型的比较
if(result ==NSOrderedSame){
NSLog(@"str == str1");
}else if(result == NSOrderedDescending){
NSLog(@"str < str1");
}else{
NSLog(@"str > str1");
}
11、字符串的转换
转大写
NSString *str1 = @"abc";
NSString *str3 = [str1 uppercaseString];
转小写
NSString *str3 = @"ABC";
NSString *str4 = [str3 lowercaseString];
单词首字母大写
NSString *str2 = @"abc asdas adasd";
NSString *str4 = [str2 capitalizedString];
基本数据类型转字符串
NSString *str = [NSString stringWithFormat:@"21312"];
字符串转基本数据类型
NSString *str = @"11212";
int num = [str intValue];
把C语言字符串转换为OC字符串
NSString *oCString = [NSString stringWithCString:"haha" encoding:NSUTF8StringEncoding];
把OC的字符串转换为C语言的字符串
NSString *str = @"it\tcast\thaha ";
const char *str1 = [str cStringUsingEncoding:NSUTF8StringEncoding];
printf("%s",str1);
字符串拼接
NSString *str = @"www-itheima-cn";
NSString *str1 = [str stringByAppendingString:@"哈哈"];
NSLog(@"%@",str1);
字符串替换
NSString *str = @"www-itheima-cn";
NSString *str1 = [str stringByReplacingOccurrencesOfString:@"-" withString:@"."];
NSLog(@"%@",str1);
字符串替换指定的位置
NSString *str = @"www-itheima-cn";
NSRange range = [str rangeOfString:@"itheima"];
NSString *str1 = [str stringByReplacingCharactersInRange:range withString:@"itcast"];
字符串删除指定的位置
NSRange range = [str rangeOfString:@"itheima"];
NSString *str1 = [str stringByReplacingOccurrencesOfString:@"itheima" withString:@""];
NSLog(@"%@",str1);
字符串去掉空格
NSString *str = @"it\tcast\thaha ";
NSString *str1 = [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
文件操作
//获取文件路径
NSString *path1 = [NSHomeDirectory() stringByAppendingString:@"/text.txt"];
//获取扩展名
// path1 =[path1 pathExtension];
//删除扩展名
// path1 = [path1 stringByDeletingPathExtension];
//添加扩展名
path1 = [path1 stringByAppendingPathExtension:@"jpg"];
NSLog(@"%@",path1);
字符串与文件(只要是file就是绝对路径)
把字符串写入文件
NSString *str = @"德玛西亚";
NSError *error = nil;//用来接收写入失败的内容,记住它是一个二级指针。
BOOL isTrue = [str writeToFile:@"/Users/jinpengyao/Desktop/lala.txt" atomically:YES encoding:NSUTF8StringEncoding error:(&error)];
if (isTrue) {
NSLog(@"文件写入成功");
}else{
NSLog(@"文件写入失败...");
}
读取文件中的内容
NSError *error = nil;//用来接收写入失败的内容,记住它是一个二级指针。
NSString *str1 = [NSString stringWithContentsOfFile:@"/Users/jinpengyao/Desktop/lala.txt" encoding:(NSUTF8StringEncoding) error:(&error)];
if(error){
NSLog(@"%@",error);
}else{
NSLog(@"%@",str1);
}
字符串与URL(Uniform Resource Locator)
URL格式:
协议头://主机名称(ip|域名)/资源路径
eg:http://www.itbaima.com/image/haha.png
file:///Users/jinpengyao/Desktop/lala.txt
file用于本机,所以它就没有主机名前面的两个//是代表协议。
转换编码方式
把UTF8编码的字符串,编码称为URL中可以用的字符串
[str stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
把URL中可用的字符串,编码称为UTF8中可以用的字符串
[str stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
通过URL写入文件
NSError *error = nil;
NSURL *url = [NSURL URLWithString:@"file:///Users/jinpengyao/Desktop/lala.txt"];
BOOL isSuccess = [str writeToURL:url atomically:YES encoding:NSUTF8StringEncoding error:(&error)];
if (isSuccess) {
NSLog(@"文件写入成功");
}else{
NSLog(@"文件写入失败...%@",error);
}
通过URL读取文件
NSError *error = nil;
NSURL *url = [NSURL URLWithString:@"file:///Users/jinpengyao/Desktop/lala.txt"];
NSString *string = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:(&error)];
NSLog(@"%@",string);
NSMutableString 可变字符串,它是NSString的子类
增改删的操作
拼接
NSMutableString *mStr = [NSMutableString stringWithFormat:@"itbaima"];
for (int i = 0 ; i < 20 ; i++) {
[mStr appendString:@" itbaima"];
}
[mStr substringFromIndex:1];
设置可以容纳多少个字符(子类扩展的方法)capacity表示容量,可以容纳多少个字符。如果字符串超过了这个存储空间,它自己会自动扩展。
[NSMutableString stringWithCapacity:10];
在指定位置加入字符串
NSMutableString *mStr = [NSMutableString stringWithFormat:@"itbaima"];
[mStr insertString:@"德玛西亚" atIndex:3];
NSLog(@"%@",mStr);
删除指定位置的字符串
NSMutableString *mStr = [NSMutableString stringWithFormat:@"itbaima"];
NSRange range = NSMakeRange(1, 3);
[mStr deleteCharactersInRange:range];
替换指定位置的字符串
NSRange range1 = [mStr rangeOfString:@"德玛"];
[mStr replaceCharactersInRange:range1 withString:@"www"];
------------------------------------------------------------------------------------------------------------
NSRange range1 = [mStr rangeOfString:@"德玛"];
//注意使用range的时候不要超过字符串的长度(超过会有一个越界错误)
[mStr replaceOccurrencesOfString:@"德玛" withString:@"西亚" options:NSCaseInsensitiveSearch range:range1];
集合类
特点:用于存储多个OC对象,相当于存储对象的容器。只能存放OC对象不能存放基本数据类型、结构体、枚举。
数组(有序的对象集合,可以存放任意的OC对象)
特点:1、同一个数组中可以存放不同类型的对象。
2、同一个对象可以被存入数组中多次。
3、不能存放基本数据类型,如果硬是要存入的花需要转换成其包装类型。
4、数组中的元素是有序的。
NSArray创建:
1、简洁的构造方法
NSArray *arr= [NSArray array];
快速创建法:
NSArray *arr2 = @[@"德玛西亚",@"拉拉阿拉",@"卡卡卡卡"];
2、通过对象方法取出指定元素
NSString *string = [arr objectAtIndex:0];
快捷方法
NSString *string = arr[0];
3、获取字符串长度
long length = [arr count];// arr.count;
4、判断数组中是否包含某个元素(判断是不是包含某个对象,是调用这个对象上的isEqual方法)
BOOL isContain = [arr2 containsObject:@"德玛西亚"];
5、数组的遍历
1、普通的for
for(int i = 0 ; i < arr2.count ; i++ ){
NSLog(@"%@",arr2[i]);
}
2、增强for
for (id obj in arr2) {
NSLog(@"%@",obj);
}
3、通过枚举器
NSEnumerator *enumer = [arr2 objectEnumerator];
id obj;
while(obj = [enumer nextObject]){
NSLog(@"%@",obj);
}
4、通过block
[arr2 enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"%@",obj);
}];
5、让数组中的每一个元素都执行某一个方法
[array makeObjectsPerformSelector:@selector(方法名)];
[array makeObjectsPerformSelector:@selector(方法名:) withObject:传入的参数];
6、数组中的排序
1、通过selector方式进行排序
1、重写比较方法
- (NSComparisonResult)compare:(id)obj{
if(self.属性 == obj.属性){
return [self.属性 compare:obj.属性];
}else if(){
return NSOrderedDescending;//降序
}else{
return NSOrderedAsscending;//升序
}
}
2、调用
[arr2 sortedArrayUsingSelector:@selector(比较方法)]
2、通过比较器
arr2 = [arr2 sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return[obj1 compare:obj2];
}];
3、属性描述器
NSSortDescriptor *desc1 = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
NSSortDescriptor *desc2 = [NSSortDescriptor sortDescriptorWithKey:@"key" ascending:YES];
arr2 = [arr2 sortedArrayUsingDescriptors:@[desc1,desc2]];
7、数组与字符串
1、字符串转数组
NSString *str = @"1,2,3,4,5,6";
//把字符串分割为数组
NSArray *arr = [str componentsSeparatedByString:@","];
2、把数组拼接成字符串
//把数组组装成字符串
NSString *str1 = [arr componentsJoinedByString:@"-"];
NSLog(@"%@",str1);
8、数组与文件
(file) 1、数组写入文件
NSArray *array = @[@"a",@"b",@"c",@"d"];
BOOL isSuccess = [array writeToFile:@"/Users/jinpengyao/Desktop/lala.txt" atomically:YES];
2、从文件中获取数组
BOOL isSuccess = NSArray *array1 = [NSArray arrayWithContentsOfFile:@"/Users/jinpengyao/Desktop/lala.txt"];
NSLog(@"%@",array1);
(URL) 都一样的
NSURL *url = [NSURL URLWithString:@"file:///Users/jinpengyao/Desktop/lala.txt"];
BOOL isSuccess = [array writeToURL:url atomically:YES];
NSMutableArray(继承与NSArray)
//普通创建方式
NSMutableArray *mArray = [NSMutableArray arrayWithObjects:@"1",@"2",@"3", @"4",@"1",nil];
//创建的时候该数组可以容乃的元素个数
NSMutableArray *mArray2 = [NSMutableArray arrayWithCapacity:10];
//不存在快速创建方式
// NSMutableArray *mArray1 = @[@"a",@"b",@"c",@"d"];//错误方法,因为它是一个不可以变数组的定义
//除非这样
mArray2.array =@[@"a",@"b",@"c",@"d"];
//增加指定的元素
[mArray addObject:@"e"];
//删除指定的元素,注意只要与指定的元素相同,都会被删除。它是通过isEqual方法进行比较的。
[mArray removeObject:@"1"];
//边遍历边删除(注意:不能使用增强的for),所有通过枚举器的方式都不可以在遍历的同时进行删除
NSMutableArray *temp =[NSMutableArray array];
for (id obj in mArray) {
if([obj isEqualToString:@"3"]){
[temp addObject:obj];
}
}
//删除mArray中的在temp中的元素
[mArray removeObjectsInArray:temp];
NSLog(@"%@",mArray);
//指定位置加入元素
[mArray insertObject:@"s" atIndex:1];
NSLog(@"%@",mArray);
-------------------------------------------------------------------------------------------
#import "CZPerson.h"
@implementation CZPerson
- (void)addAges{
self.age += 1;
}
- (void)findPerson:(NSNumber *)age{
int intAge = [age intValue];
if(intAge == self.age ){
NSLog(@"对我今年就是%d岁",intAge);
}
}
//自定义比较器
- (NSComparisonResult)compare:(CZPerson *)other{
if(self.age == other.age){//如果self的age等于other的age就在比较name
return [self.name compare:other.name];
}else if(self.age > other.age){//如果self的age大于other的age就让它降序
return NSOrderedDescending;
}else{//如果self的age小于other的age就让它升序
return NSOrderedAscending;
}
}
//如果你想NSLog(@"%@",arr);这样遍历数组,那么就乖点把这个加上。
- (NSString *)description{
return [NSString stringWithFormat:@"name = %@ ,age = %d",self.name , self.age];
}
@end
//通过枚举器遍历数组
NSArray *arr = @[@"a",@"b",@"c",@"d"];
NSEnumerator *enumerator = [arr objectEnumerator];
id obj = nil;
while(obj = [enumerator nextObject]){
NSLog(@"%@",obj);
}
NSLog(@"------------");
//通过block遍历数组
[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"%@",obj);
}];
//
// CZPerson *person1 = [[CZPerson alloc]init];
// person1.age = 15;
// person1.name = @"你好1";
// CZPerson *person2 = [[CZPerson alloc]init];
// person2.age = 14;
// person2.name = @"你好2";
//
// CZPerson *person3 = [[CZPerson alloc]init];
// person3.age = 13;
// person3.name = @"你好3";
//
// CZPerson *person4 = [[CZPerson alloc]init];
// person4.age = 12;
// person4.name = @"你好4";
//
// CZPerson *person5 = [[CZPerson alloc]init];
// person5.age = 11;
// person5.name = @"你好5";
//
// NSArray *arr = @[person1,person2,person3,person4,person5];
遍历数组
[arr makeObjectsPerformSelector:@selector(addAges)];
for (CZPerson *person in arr) {
NSLog(@"name = %@ , age = %d",person.name,person.age);
}
// //使用枚举器变量数组
NSEnumerator *enumerator =[arr objectEnumerator];
CZPerson *person ;
while(person = [enumerator nextObject] ){
NSLog(@"name = %@ , age = %d",person.name,person.age);
//
}
//
//
// //通过block遍历数组,并且当碰到12岁就不遍历了//当遍历到索引值为2的时候就停止遍历
[arr enumerateObjectsUsingBlock:^(CZPerson *person, NSUInteger idx, BOOL *stop) {
NSLog(@"name = %@ , age = %d",person.name,person.age);
if(14 == person.age){
*stop = YES;
}
if(idx == 2){
*stop = YES;
}
}];
// //让数组里面的所有元素都执行一下方法,
// [arr makeObjectsPerformSelector:@selector(addAges)];
// NSNumber *number = [NSNumber numberWithInt:15];
// [arr enumerateObjectsUsingBlock:^(CZPerson *person, NSUInteger idx, BOOL *stop) {
// NSLog(@"name = %@ , age = %d",person.name,person.age);
if(14 == person.age){
*stop = YES;
}
// if(idx == 2){
// *stop = YES;
// }
// }];
// //让数组里面的所有元素都执行一下,并且根据传入的参数找到合适的东西。
// [arr makeObjectsPerformSelector:@selector(findPerson:) withObject:number];
比较器
// CZPerson *person1 = [[CZPerson alloc]init];
// person1.age = 15;
// person1.name = @"你好1";
// CZPerson *person2 = [[CZPerson alloc]init];
// person2.age = 12;
// person2.name = @"你好2";
//
// CZPerson *person3 = [[CZPerson alloc]init];
// person3.age = 13;
// person3.name = @"你好3";
//
// CZPerson *person4 = [[CZPerson alloc]init];
// person4.age = 16;
// person4.name = @"你好4";
//
// CZPerson *person5 = [[CZPerson alloc]init];
// person5.age = 11;
// person5.name = @"你好5";
// NSArray *arr = @[person1,person2,person3,person4,person5];
// //通过选择器进行排序
// //要注意NSArray是一个不可变的数组,之后排好序需要让自己重新指一下被改的地址,不然不会发生任何变化。
arr = [arr sortedArrayUsingSelector:@selector(compare:)];
NSEnumerator *enumerator =[arr objectEnumerator];
CZPerson *person ;
while(person = [enumerator nextObject] ){
NSLog(@"name = %@ , age = %d",person.name,person.age);
}
// //使用比较器(bock)进行排序(实质很重写比较器差不多)
arr = [arr sortedArrayUsingComparator:^NSComparisonResult(CZPerson *cPerson1, CZPerson *cPerson2) {
if(cPerson1.age == cPerson2.age){
return [cPerson1.name compare: cPerson2.name];
}else if(cPerson1.age > cPerson2.age){
return NSOrderedDescending;
}else{
return NSOrderedAscending;
}
}];
NSEnumerator *enumerator =[arr objectEnumerator];
CZPerson *person ;
while(person = [enumerator nextObject] ){
NSLog(@"name = %@ , age = %d",person.name,person.age);
}
// //通过属性描述器进行排序
// NSSortDescriptor *desc1 = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];
// NSSortDescriptor *desc2 = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
// arr = [arr sortedArrayUsingDescriptors:@[desc1,desc2]];
NSEnumerator *enumerator = [arr objectEnumerator];
CZPerson *person ;
while(person = [enumerator nextObject]){
NSLog(@"name = %@ ,age =%d",person.name ,person.age);
}
// [arr enumerateObjectsUsingBlock:^(CZPerson *person, NSUInteger idx, BOOL *stop) {
// NSLog(@"%@",person);
if(idx == 2){
*stop = YES;
}
// if(person.age == 12){
// *stop = YES;
// }
// }];