OC基础知识之字符串NSString与NSMutableString

  • 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中
浅拷贝:产生新对象
深拷贝:产生新对象

你可能感兴趣的:(OC基础知识之字符串NSString与NSMutableString)