- NSMutableString是NSString的子类,即NSString有的方法NSMutableString也有。
- NSMutableString是可变的字符串,NSString是不可变字符串,即NSMutableString可以对字符串进行增删改操作,NSString则不可以。
NSString不可变字符串的使用:
1、创建字符串对象
NSString *str1= [NSString stringWithString:@"hello world1"]; //一般不用这种方法
NSLog(@"=====str1:%@",str1);
NSString *str2 = [[NSString alloc] initWithString:@"hello world2"];//一般也不用这种方法
NSLog(@"=====str2:%@",str2);
NSString *str3 = @"hello world3"; //常用方法
NSLog(@"=====str3:%@",str3);
//如果事先不知道字符串的值,可以先初始化一个空字符串,后面再进行赋值
NSString *str4 = nil;
str4 = @"hello world4";
NSLog(@"=====str4:%@",str4);
2、C类型字符串转化成OC类型字符串,OC类型转化成C类型
char *s = "hello world";
//参数一 常量字符串 参数二 编码格式
NSString *str = [[NSString alloc] initWithCString:s encoding:NSUTF8StringEncoding];
NSLog(@"=====str1:%@",str1);
NSString *str1 = @"This is oc";
const char *p = [str1 UTF8String];
NSLog(@"=====p:%s",p);
3、字符串转化成基本数据类型
NSString *str = @"100";
NSInteger i = str.integerValue; //100
NSString *str2 = @"100.1";
NSInteger f = str2.floatValue;//1oo.1
NSString *str3 = @"1";
BOOL b = str3.boolValue; //YES
4、字符串格式化
NSString *str1 = [NSString stringWithFormat:@"%@%d%@,体重%.1fkg",@"张三身高",180,@"cm",60.5];
//打印结果:======str1张三身高180cm,体重60.5kg
NSLog(@"======str1:%@",str1);
NSString *name = @"张三";
NSInteger age = 20;
NSString *str88 = [NSString stringWithFormat:@"%@的年龄=%d",name,age];
5、字符串长度
NSString *str = @"hello";
NSLog(@"=====length:%d 或者 length:%d",str.length,[str length]);
6、比较2个字符串是否相等
NSString *str1 = @"hello";
NSString *str2 = @"hello2";
if ([str1 isEqualToString:str2]) {
NSLog(@"相等");
}else{
NSLog(@"不相等");
}
7、比较2个字符串的大小
// 比较结果 NSOrderedSame 相等 NSOrderedAscending 小于 NSOrderedDescending 大于
NSString *str1 = @"student1";
NSString *str2 = @"student2";
NSInteger result = [str1 compare:str2];
if (result == NSOrderedSame) {
NSLog(@"等于");
} else if(result == NSOrderedAscending){
NSLog(@"小于");
}else {
NSLog(@"大于");
}
8、字符串查找
//字符串查找,在str1中能否查找到str2和str3字符串
NSString *str1 = @"NSOrderedSame,NSOrderedAscending,NSOrderedDescending";
NSString *str2 = @"Same";
NSString *str3 = @"Same2";
NSRange range = [str1 rangeOfString:str2];
NSRange range2 = [str1 rangeOfString:str3];
//判断条件
if (range.location == NSNotFound && range.length == 0) {
NSLog(@"===1:没有找到的判断");
} else {
NSLog(@"===1:location is %ld length is %ld",range.location,range.length);
}
if (range2.location == NSNotFound && range2.length == 0) {
NSLog(@"===2:没有找到的判断");
} else {
NSLog(@"===2:location is %ld length is %ld",range2.location,range2.length);
}
//最终输出
//===1:location is 9 length is 4
//===2:没有找到的判断
9、字符串截取
NSString * str1 = @"张三2010年从北京大学毕业";
// 从指定的index开始截取到字符串末尾
NSString * str2 = [str1 substringFromIndex:str1.length-3];
NSLog(@"str2 is %@",str2);//str2 is 学毕业
//从开始位置一直截取到指定的index位置
NSString *str3 = [str1 substringToIndex:2];
NSLog(@"str3 is %@",str3);//str3 is 张三
// 截取第三到第八之间的字符(包含第三和第八),注意oc的下标是从0开始计数
NSString *str4 = [str1 substringWithRange:NSMakeRange(3, 6)];
NSLog(@"str4 is %@",str4);//str4 is 010年从北
NSMutableString可变字符串的使用
NSMutableString是NSString的子类,所以上面NSString的所有方法NSMutableString都可以使用,下面我们着重讲解下可变字符串才拥有的增删改方法
1、创建可变字符串
NSMutableString *str = [NSMutableString stringWithString:@"hello"];//静态方法
NSMutableString *str1 = [[NSMutableString alloc] initWithString:@"hello"];//动态方法
NSMutableString *str2 = @"hello";//通过这种方法创建的对象是个不可变字符串,使用可变字符串的方法会crash,所以可变字符串一般不使用这种方法创建
2、可变字符串的增删改方法
NSMutableString *str = [NSMutableString stringWithString:@"hello"];
//追加 world
[str appendString:@"world"];
NSLog(@"str is:%@",str); //str is:helloworld
//插入 你好
[str insertString:@"你好" atIndex:5];//str is:hello你好world
NSLog(@"str is:%@",str);
//删除 你好
// [str deleteCharactersInRange:NSMakeRange(5, 2)]; 或者
[str deleteCharactersInRange:[str rangeOfString:@"你好"]];
NSLog(@"str is:%@",str); //str is:helloworld
NSString与NSMutableString的区别
1、不可变字符串先后操作的内存空间不一样 而可变字符串是一致的
NSMutableString *str = [NSMutableString stringWithString:@"hello"];
NSString *str2 = @"hello";
NSLog(@"before str:%@ %p",str,str);
NSLog(@"before str2:%@ %p",str2,str2);
[str appendString:@"world"];
str2 = @"helloworld";
NSLog(@"after str:%@ %p",str,str);
NSLog(@"after str2:%@ %p",str2,str2);
/*
输出结果:
before str:hello 0x103314420
before str2:hello 0x100005220
after str:helloworld 0x103314420
after str2:helloworld 0x1000052a0
从输出结果可以看出,不可变字符串先后操作的内存空间不一样 而可变字符串是一致的
*/
2、深拷贝(mutableCopy)和浅拷贝(copy)的区别
先看NSString的深浅拷贝
NSString * string = @"hello world";
//浅拷贝
NSString * copyString = [string copy];
//深拷贝
NSMutableString * mutableCopyString = [string mutableCopy];
NSLog(@"\nstring = %p\ncopyString = %p\nmutableCopyString = %p",string,copyString,mutableCopyString);
/*
输出结果:
string = 0x100005220
copyString = 0x100005220
mutableCopyString = 0x10072dcb0
*/
由此看出NSString中
浅拷贝:未产生新对象
深拷贝:产生新对象
再看NSSMutableString的深浅拷贝
NSMutableString * string = [NSMutableString stringWithString:@"hello world"];
//浅拷贝
NSString * copyMString = [string copy];
//深拷贝
NSMutableString * mutableCopyMString = [string mutableCopy];
NSLog(@"\nmString = %p\ncopyMString = %p\nmutableCopyMString = %p",string,copyMString,mutableCopyMString);
/*
输出结果:
mString = 0x102900150
copyMString = 0x102900180
mutableCopyMString = 0x1029001a0
*/
由此看出NSSMutableString中
浅拷贝:产生新对象
深拷贝:产生新对象