NSString与NSMutableString的应用小结

一. NSString

1.见名知意,Objective-C中字符串是一个对象,NSString是用于储存字符串对象的。

2.字符长度
(1).NSString类型,长度用length计算,中英文(包括各类符号)都各自只占一个字节。
(2).在Xcode中C语言中一个汉字(包括各类符号)占3个字节,英文(包括各类符号)占一个字节。

3.通过不同的方式创建OC字符串,字符串的存储位置也不一样
(1).如果是通过字符串常量创建,并且字符串常量的内容一致,那么创建的多个对象指向常量区中同一块存储空间

    NSString *str1 = @"abc";
    NSString *str2 = @"abc";
    NSLog(@"str1 = %p  str2 = %p",str1,str2);

(2).如果是通过alloc initWithFormat/stringWithFormat创建,那么字符串对象存储在堆区中;在OS X中用上述两方法创建相同对象,系统会自动优化,让都指向同一块内存空间;在iOS中用上述两方法创建对象,会在堆区中开辟不同的存储空间
可以用下面代码在不同的平台上验证:

    NSString *str3 = [[NSString alloc]initWithFormat:@"abc"];
    NSString *str4 = [[NSString alloc]initWithFormat:@"abc"];
    NSString *str5 = [NSString stringWithFormat:@"abc"];
    NSString *str6 = [NSString stringWithFormat:@"abc"];
    NSLog(@"str3 = %p  str4 = %p str5 = %p  str6 = %p",str3,str4,str5,str6); 

(3).注意:其实OC中只要是用alloc创建的对象,每次都会在堆区新开辟空间创建对象;但是如果是通过alloc的initWithString方法除外,因为这个方法是通过copy返回一个字符串对象给我们,而copy又分为深拷贝和浅拷贝,如果是深拷贝会创建一个新的对象,如果是浅拷贝不会创建一个新的对象,而是直接返回被拷贝的对象的地址给我们
可以用下面代码验证:

    NSString *str7 = [NSString stringWithString:@"abc"];
    NSString *str8 = [NSString stringWithString:@"abc"];
    NSString *str9 = [NSString stringWithString: [str7 copy]];
    NSString *str10 = [NSString stringWithString: [str7 mutableCopy]];
    NSLog(@"str7 = %p  str8 = %p  str9 = %p  str10 = %p ",str7,str8,str9,str10);

4.字符串的读写<1>
(1).从文件中读取字符串,使用+ (instancetype)stringWithContentsOfFile:(NSString )path encoding:(NSStringEncoding)enc error:(NSError *)error;
file: 文件路径
encoding: 文件中的文字编码类型,编码英文 iOS-5988-1 中文 GBK GBK2312 , 一般情况填写UTF-8
error: 如果读取错误, 会将错误信息保存到error中 ,如果读取正确, 就没有error = nil ;注意error是(NSError )类型,是地址的地址,运用时要注意!
代码如下:

    NSString *path = @"/Users/MAC_SJM/Desktop/SS.txt";
    NSError *error = nil;
    NSString *str = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];
    //可以先判断是否有错误,再输出;如果不关心错误,可以直接在方法里面写nil
    if (error == nil) {
       NSLog(@"%@",str);
    } else {
      //localizedDescription:这是属性会输出具体的错误原因
      //localizedFailureReason:这个属性会简单提示错误原因
      NSLog(@"%@",error.localizedDescription);
      NSLog(@"%@",error.localizedFailureReason);
      NSLog(@"%@",error);
    }

(2).把字符串写入到文件中,使用- (BOOL)writeToFile:(NSString )path atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError *)error;
该方法返回一个BOOL,成功写入返回YES,失败返回NO;路径中没有对应的文件,会新创建一个再写入;如果有文件,里面的内容会被后写入的内容覆盖。
atomically:如果传入YES, 字符串写入文件的过程中如果没有写完, 那么不会生成文件;如果传入NO, 字符串写入文件的过程中如果没有写完, 会生成文件

    NSString *path = @"/Users/MAC_SJM/Desktop/SS.txt";
    NSError *error = nil;
    NSString *str = @"天天编程,GO GO GO!";
    BOOL boo = [str writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil];
    if (boo) {
      NSLog(@"写入成功");
    } else {
      NSLog(@"写入失败");
    }

5.字符串的读写<2>
URL(统一资源定位符):协议头 + 主机地址 + 文件路径

(1).读取文件,使用+ (instancetype)stringWithContentsOfURL:(NSURL )url encoding:(NSStringEncoding)enc error:(NSError *)error;

(a).当路径中没有中文

代码如下:

    NSURL *url1 =  [NSURL URLWithString:@"file://172.17.26.132/Users/MAC_SJM/Desktop/SS.txt"];
    //如果加载的资源是本机上的资源,那么URL中的主机地址可以省略;
    //虽然主机地址可以省略,但是需要注意,文件路劲中最前面的/不能省略,文件路径最前面的/代表根路径
    NSURL *url2 =  [NSURL URLWithString:@"file:///Users/MAC_SJM/Desktop/SS.txt"];
    NSString *str1 = [NSString stringWithContentsOfURL:url1 encoding:NSUTF8StringEncoding error:nil];
    NSString *str2 = [NSString stringWithContentsOfURL:url2 encoding:NSUTF8StringEncoding error:nil];
    NSLog(@"%@",str1);
    NSLog(@"%@",str2);

(b).当路径中有中文

代码如下:

    //当用URLWithString:方法时,因为url不支持中文,如果URL中包含中文,那么无法访问,如果包含中文,就得先进行编码
    NSString *path = @"file://172.17.26.132/Users/MAC_SJM/Desktop/未命名文件夹/SS.txt";
    path = [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];   
    NSURL *url1 = [NSURL URLWithString:path];
    //如果是通过NSURL的fileURLWithPath:方法创建URL,那么系统会自动给我们传入的字符串添加协议头(file://),
    //哪怕URL中包含中文也可以进行访问,系统内部会自动对URL中包含的中文进行处理
    NSURL *url2 = [NSURL fileURLWithPath:@"@"/Users/MAC_SJM/Desktop/未命名文件夹/SS.txt""];

    NSString *str1 = [NSString stringWithContentsOfURL:url1 encoding:NSUTF8StringEncoding error:nil];
    NSString *str2 = [NSString stringWithContentsOfURL:url2 encoding:NSUTF8StringEncoding error:nil];
    NSLog(@"%@",str1);
    NSLog(@"%@",str2);

(2).写入文件,使用- (BOOL)writeToURL:(NSURL )url atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError *)error;
该方法返回一个BOOL,成功写入返回YES,失败返回NO;路径中没有对应的文件,会新创建一个再写入;如果有文件,里面的内容会被后写入的内容覆盖。

代码如下:

    //URL不包含中文
    NSString *path1 = @"file://172.17.26.132/Users/MAC_SJM/Desktop/SS.txt";
    NSURL *url1 = [NSURL URLWithString:path1];
    //URL包含中文,使用URLWithString:方法要先进行编码
    NSString *path2 = @"file://172.17.26.132/Users/MAC_SJM/Desktop/未命名文件夹/SS1.txt";
    path2 = [path2 stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSURL *url2 = [NSURL URLWithString:path2];
    //URL包含中文,使用fileURLWithPath:方法
    NSURL *url3 = [NSURL fileURLWithPath:@"/Users/MAC_SJM/Desktop/未命名文件夹/SS2.txt"];

    NSString *str = @"你好";
    //URL没有对应的文件,会新创建一个再写入;如果有文件,里面的内容会被后写入的内容覆盖。
    [str writeToURL:url1 atomically:YES encoding:NSUTF8StringEncoding error:nil];
    [str writeToURL:url2 atomically:YES encoding:NSUTF8StringEncoding error:nil];
    [str writeToURL:url3 atomically:YES encoding:NSUTF8StringEncoding error:nil];

6.字符串的比较

    NSString *str1 = @"abcD";
    NSString *str2 = @"abcd";
    //isEqualToString:是比较内容是否相同
    if ([str1 isEqualToString:str2]) {
      NSLog(@"内容相同");
    } else {
      NSLog(@"内容不相同");
    }
    //str1 == str2 是比较字符串地址是否相等
    if (str1 == str2) {
      NSLog(@"地址相同");
    } else {
      NSLog(@"地址不相同");
    }

    //比较字符串大小
    //NSOrderedAscending = -1L   小于
    //NSOrderedSame              等于
    //NSOrderedDescending        大于
    switch ([str1 compare:str2]) {
      case NSOrderedAscending:
        NSLog(@"str1小于str2");
        break;
      case NSOrderedSame:
        NSLog(@"str1等于str2");
        break;
      case NSOrderedDescending:
        NSLog(@"str1大于str2");
        break;
      default:
        break;
    }

    //忽略大小写比较大小
    switch ([str1 caseInsensitiveCompare:str2]) {
      case NSOrderedAscending:
        NSLog(@"str1小于str2");
        break;
      case NSOrderedSame:
        NSLog(@"str1等于str2");
        break;
      case NSOrderedDescending:
        NSLog(@"str1大于str2");
        break;
      default:
        break;
    }

7.字符串搜索

    // 1. - (BOOL)hasPrefix:(NSString *)aString;方法是从前往后找
    NSString *str1 = @"abcdef";
    if ([str1 hasPrefix:@"ab"]) {
      NSLog(@"前面有%@",@"ab");
    } else {
      NSLog(@"前面没有%@",@"ab");
    }
    // 2. - (BOOL)hasSuffix:(NSString *)aString;方法是从后往前找
    NSString *str2 = @"abcd";
    if ([str2 hasSuffix:@"cd"]) {
      NSLog(@"后面有%@",@"cd");
    } else {
      NSLog(@"后面没有%@",@"cd");
    }

    // 3. - (NSRange)rangeOfString:(NSString *)aString;判断字符串是否包含某个字符串,返回一个NSRange变量,
    //如果没有需要查找的字符串, 那么返回的range的length=0, location = NSNotFound
    // NSRange是一个结构体,用于查找到的字符串信息
    //typedef struct _NSRange {
    //    NSUInteger location;//存储查找到的字符串起始位置,从0开始,类似数组下标
    //    NSUInteger length;//存储查找到的字符串长度
    //  } NSRange;
    NSString *str3 = @"abcdef";
    NSRange range = [str3 rangeOfString:@"de"];
    if (range.location ==NSNotFound) {
      NSLog(@"没有找到");
    } else {
      //+ (NSValue *)valueWithRange:(NSRange)range;方法用于把NSRange变量转化成对象
      NSLog(@"%@", [NSValue valueWithRange:range]);
    }

8.字符串的截取

(1).- (NSString *)substringWithRange:(NSRange)range;方法是根据NSRange变量截取字符串

(2).- (NSString *)substringToIndex:(NSUInteger)to;方法是从头开始截取,截取n个字符

(3).- (NSString *)substringFromIndex:(NSUInteger)from;方法是从第n个开始截取,一直截取到最后

代码如下:

    NSString *str = @"string";
    NSRange range = NSMakeRange(3, 3);

    NSString *str2 = [str substringWithRange:range];
    NSLog(@"%@",str2);

    NSString *str3 = [str substringToIndex:3];
    NSLog(@"%@",str3);

    NSString *str4 = [str substringFromIndex:3];
    NSLog(@"%@",str4);

9.字符串的替换和过滤

    NSString *str = @"  www,&baidu&,com  ";
    NSLog(@"%@",str);

    //OccurrencesOfString:要替换的字符串
    //withString:用谁替换
    NSString *str1 = [str stringByReplacingOccurrencesOfString:@"&" withString:@"."];
    NSLog(@"%@",str1);

    //CharactersInRange:在那个区间替换
    //withString:用谁替换
    NSString *str2 = [str stringByReplacingCharactersInRange:NSMakeRange(3, 7) withString:@".baidu."];
    NSLog(@"%@",str2);

    //stringByReplacingPercentEscapesUsingEncoding:方法是把字符串转换成NSUTF8StringEncoding
    NSString *str3 = [str stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSLog(@"%@",str3);

    //NSCharacterSet类可定义过滤集合,用于过滤字符串,whitespaceAndNewlineCharacterSet代表过滤空格
    NSCharacterSet *set = [NSCharacterSet whitespaceAndNewlineCharacterSet];
    NSString *str4 = [str stringByTrimmingCharactersInSet:set];
    NSLog(@"%@",str4);

10.字符串与路径

    NSString *path = @"/Users/MAC_SJM/Desktop/SS.txt";

    //1.判断是否是绝对路径
    //实质:是判断是否是以/开头
    NSLog(@"%@",[path isAbsolutePath] ? @"是绝对路径" : @"不是绝对路径");

    //2.判断是否是最后一个目录
    //实质:是获取最后一个/后面的内容
    NSLog(@"%@",[path lastPathComponent] );

    //3.删除最后一个目录的内容
    //实质:是删除最后一个/后面的内容, 包括/也会被删除
    NSLog(@"%@",[path stringByDeletingLastPathComponent]);

    //4.给文件路径添加一个目录
    //实质:在字符串的末尾加上一个/和指定的内容
    //     如果路径后面已经有了/, 那么就不会添加了
    //     如果路径后面有多个/, 那么会自动删除多余的/, 只保留一个
    NSLog(@"%@",[path stringByAppendingPathComponent:@"new/"]);

    //5.获取路径中文件的扩展名
    //实质是:从字符串后面往前找,找到第一个点.,截取点后面的内容
    NSLog(@"%@",[path pathExtension]);

    //6.删除文件的扩展名
    //实质:是从字符串后面往前找,找到第一个点.,删除点后面的内容
    NSLog(@"%@",[path stringByDeletingPathExtension]);

    //7.添加扩展名
    //实质:是在最后面加上点.和指定的扩展名
    NSLog(@"%@",[path stringByAppendingPathExtension:@"pdf"]);

11.字符串的转换

    //字符串转换成大写
    NSString *newStr =[oldStr uppercaseString];
    NSLog(@"%@",newStr);

    //字符串转换成小写
    NSString *newStr2 = [newStr lowercaseString];
    NSLog(@"%@",newStr2);

    //单词首字符大写
    NSString *newStr3 = [oldStr capitalizedString];
    NSLog(@"%@",newStr3);

    //字符串与基本数据类型的转换
    //注意:如果不是int,double,float,bool,integer,longlong这些类型就不能转换
    NSString *str1 = @"100";
    NSString *str2 = @"12.5";
    int value1 = [str1 intValue];
    double value2 = [str2 floatValue];
    NSLog(@"%.1f",value1 + value2);

    //C语言字符串与OC字符串的转换
    char *cStr1 = "hello world";
    NSString *ocStr = [NSString stringWithUTF8String:cStr1];
    NSLog(@"%@",ocStr);
    const char * cStr2 = [oldStr UTF8String];
    NSLog(@"%s",cStr2);

二. NSMutableString

1.NSMutableString是NSString的子类,在NSString上有的方法,NSMutableString也可以用。

2.NSMutableString的增删查改操作

    //创建一个新的字符串
    NSMutableString *strM = [NSMutableString string];
    //添加字符串
    [strM appendString:@"abc"];
    NSLog(@"%@",strM);
    [strM appendFormat:@"def"];
    NSLog(@"%@",strM);

    //删除指定字符串
    NSRange range1 = NSMakeRange(3, 2);
    [strM deleteCharactersInRange:range1];
    NSLog(@"%@",strM);

    //插入字符串
    NSRange range2 =NSMakeRange(1, 2);
    [strM insertString:@"A" atIndex:range2.location];
    NSLog(@"%@",strM);

    //替换字符串
    //OccurrencesOfString:需要替换的子字符串
    //withString:用什么替代
    //返回值:替换了多少个字符
    NSUInteger count = [strM replaceOccurrencesOfString:@"A" withString:@"B" options:0 range:NSMakeRange(0, strM.length)];
    NSLog(@"%lu",count);
    NSLog(@"%@",strM);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值