zoukankan      html  css  js  c++  java
  • NSString以及对字符串的增删改查

    NSString

     

    什么是NSString?

    一个NSString对象就代表一个字符串(文字内容) 一般称NSString为字符串类

     

    如何创建字符串对象

       

         通过不同的方式创建字符串,字符串对象储存的位置也不一样

         >如果是通过字符串常量创建,那么字符串对象存储在常量区中

         >如果是通过alloc initWithFormat/stringWithFormat创建,那么字符串对象存储在堆区中

         而且需要注意:

         >不同的平台存储的方式也不一样,如果是Mac平台系统会自动对字符串对象进行优化,但是如果是iOS平台就是两个对象

         >不同的编译器存储的方式也不一样,如果是Xcode6以下并且是在iOS平台,那么每次alloc都会创建一个新的对象,如果是在Xcode6以上那么alloc多次指向同一块存储空间

    //1.通过字符串常量创建
        //注意:如果是通过字符串常量创建对象,并且字符串常量的内容一致,那么如果创建多个字符串对象,多个对象指向同一块存储空间
        NSString *str1 = @"lnj";
        NSString *str11 = @"lnj";
        NSLog(@"str1 = %p, str11 = %p", str1 ,str11);
        
        //2.通过alloc init创建
        //只要调用alloc就会在堆内存中开辟一块存储空间
        NSString *str2 = [[NSString alloc]initWithFormat:@"lmj"];
        NSString *str22 = [[NSString alloc]initWithFormat:@"lmj"];
        NSLog(@"str2 = %p, str22 = %p", str2, str22);
        
        //3.通过类工厂方法创建/ stringWithFormat
        //内部其实就是封装了alloc init
        NSString *str3 = [NSString stringWithFormat:@"zs"];
        NSString *str33= [NSString stringWithFormat:@"zs"];
        
        /*
         注意:一般情况下,只要是通过alloc或者类工厂方法创建的对象,每次都会在堆内存中开辟一块新的存储空间
         但是如果是通过alloc的initWithString方法除外,因为这个方法是通过copy返回一个字符串对象给我们
         而copy又分为深拷贝和浅拷贝,如果是深拷贝会创建一个新的对象,如果是浅拷贝不会创建一个新的对象,而是直接返回被拷贝的对象的地址给我们
         */
        
        NSString *str4 = [[NSString alloc]initWithString:@"ls"];
        NSString *str44 = [[NSString alloc]initWithString:@"ls"];
        NSLog(@"str4 = %p, str44 = %p", str4, str44);

    字符串读写上

    问题1:如何从文件中读取字符串?什么是绝对路径?编码的常用格式是什么?错误信息是如何读取的?

    /*
     file: 文件路径,
     encoding: 编码英文 iOS-5988-1 中文 GBK GBK2312 , 一般情况填写UTF-8
     error: 如果读取错误, 会将错误信息保存到error中 ,如果读取正确, 就没有error = nil
     注意: 以后在OC方法中但凡看到XXXofFile的方法, 传递的一定是全路径(绝对路径)
     */
    NSString *path = @"/Users/xiaomage/Desktop/课堂共享/day17/note/lnj.txt";
    NSError *error = nil;
    
    // 从文件中读取字符串
    NSString *str = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];
    if (error == nil) {
    
    NSLog(@"str = %@", str);
    }else
    {
        //localizedDescription 打印真正错误信息
        NSLog(@"error = %@", [error localizedDescription]);
    }

    问题2:如何将字符串写入到文件中?

    SString *str = @"iOS0601基础班";
    // atomically 如果传入YES, 字符串写入文件的过程中如果没有写完, 那么不会生成文件
    //            如果传入NO, 字符串写入文件的过程中如果没有写完, 会生成文件
    NSString *path2 = @"/Users/xiaomage/Desktop/abc.txt";
    BOOL flag = [str writeToFile:path2 atomically:YES encoding:NSUTF8StringEncoding error:nil];
    NSLog(@"flag = %i", flag);

    字符串读写下(通过URL获取数据)

    问题1:什么是URL?

    答:

    1. URL的全称是Uniform Resource Locator(统一资源定位符)
    2. URL是互联网上标准资源的地址
    3. 互联网上的每个资源都有一个唯一的URL,它包含的信息指出资源的位置
    4. 根据一个URL就能找到唯一的一个资源

    问题2:书写URL格式?

    答: URL = 协议头://主机地址/路径

    问题3:如何创建URL

        通过alloc 或者类工厂方法创建
        NSURL *url = [NSURL URLWithString:@"file:///Users/LNJ/Desktop/str.txt"];
        NSURL *url = [[NSURL alloc] initWithString:@"file:///Users/LNJ/Desktop/str.txt"];
        通过文件路径创建(默认就是file协议的)
        NSURL *url = [NSURL fileURLWithPath:@"/Users/LNJ/Desktop/str.txt"];

    问题4:如何获取本地路径的信息?获取本地路径信息的方法有什么注意点?

    答:获取本地路径信息--fileURLWithPath

    方法一:


        1.字符串保存路径

        NSString *path = @"file://192.168.13.10/Users/xiaomage/Desktop/课堂共享/day17/note/lnj.txt";
        NSLog(@"url编码前: %@", path);

    2.将路径中中文转换为UTF-8编码格式

        path = [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
        NSLog(@"url编码后: %@", path);

    方法二:


        1.字符串保存路径,如果访问本机的文件, 可以省略主机地址

        NSString *path = @"file:///Users/xiaomage/Desktop/课堂共享/day17/note/lnj.txt";
        NSLog(@"url编码前: %@", path);

    2.将路径中中文转换为UTF-8编码格式

       path = [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
        NSLog(@"url编码后: %@", path);
    
    NSURL *url = [NSURL URLWithString:path];

     

    3.获取本地路径的信息

        NSURL *url = [NSURL fileURLWithPath:@"/Users/xiaomage/Desktop/课堂共享/day17/note/lnj.txt"];
    
    NSError *error = nil;
        NSString *str = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
        if (error == nil) {
    
    NSLog(@"str = %@", str);
        }else{
            NSLog(@"error = %@", [error localizedDescription]);
        }

    注意点:

    • URLWithString: 方法不支持中文,所以无法成功创建URL,必须先对路径字符串进行编码
    • fileURLWithPath: 方法支持中文,并且省略协议头,但是只能获取本地方法

    问题5:如何获取网络路径的信息?

    答: 获取网络路径的信息--URLWithString

        NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
        NSString *str = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
        NSLog(@"str = %@", str);

     

    问题6:如何将信息写入到指定文件?

    答:

    方法一:

        NSString *str = @"lnj";
        NSString *path = @"file:///Users/NJ-Lee/Desktop/未命名文件夹/abc.txt";
        path = [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
        NSURL *url = [NSURL URLWithString:path];
    
    [str writeToURL:url atomically:YES encoding:NSUTF8StringEncoding error:nil];

    方法二:

    NSString *str = @"lnj";
    NSString *path = @"/Users/NJ-Lee/Desktop/未命名文件夹/abc.txt";
    NSURL *url = [NSURL fileURLWithPath:path];
    
    [str writeToURL:url atomically:YES encoding:NSUTF8StringEncoding error:nil];

    总结:

    1. 如果多次往同一个文件中写入内容,那么后一次的会覆盖前一次的
    2. 方法名中没有file,路径中要添加上file协议头,如果方法名中有file,路径中就不需要file协议头

    字符串比较

    NSString *str1 = @"abc";
    NSString *str2 = @"ABC";

    问题1:如何比较两个字符串的"内容"是否相同?

    答:

    BOOL flag = [str1 isEqualToString:str2];
    NSLog(@"flag = %i", flag);

    问题2:如何比较两个字符串的"地址"是否相同?

    flag = (str1 == str2);
    NSLog(@"flag = %i", flag);

    问题3:如何比较字符串的大小?

    答:使用方法compare:

    // NSOrderedAscending  前面的小于后面的
    // 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;
    }

    问题4:如何忽略大小写进行比较?

    答:

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

     

    字符串搜索

    理解几个搜索字符串方法的本质

    NSString *str = @"http://www.520it.com/img/lnj.gif";

    问题1:如何判断字符串是以什么开头的?本质是什么?

    答:

    // 本质就是从字符串的第一个字符开始匹配, 只要不匹配就返回NO
    
    if ([str hasPrefix:@"http://"]) {
        NSLog(@"是一个URL");
    }else
    {
        NSLog(@"不是一个URL");
    }

    问题2:如何判断字符串是否以什么结尾的?本质是什么?

    答:

    // 本质就是从字符串的最后一个字符开始匹配, 只要不匹配就返回NO
    
    if ([str hasSuffix:@".gif"]) {
        NSLog(@"动态图片");
    }else{
        NSLog(@"不是动态图片");
    }

    问题3:如何判断字符串中是否包含520it.com?本质是什么?

    答:

    NSString *str = @"abcd";
    // 只要str中包含该字符串, 那么就会返回该字符串在str中的起始位置以及该字符串的长度
    // location从0开始 , length从1开始
    // 如果str中没有需要查找的字符串, 那么返回的range的length=0, location = NSNotFound
    NSRange range =  [str rangeOfString:@"lnj"];
    //    if (range.location == NSNotFound) {
    if (range.length == 0){
        NSLog(@"str中没有需要查找的字符串");
    }else{
        NSLog(@"str中有需要查找的字符串");
        NSLog(@"location = %lu, length = %lu", range.location, range.length);
    }

    字符串截取

    OC中的结构体,使用什么开头的方法创建

    NSString *str = @"<head>小码哥</head>";

    问题1:如何获取指定范围内的字符串?

    答:

    1.动态获取截取的起始位置
    
    NSUInteger location = [str rangeOfString:@">"].location + 1;
    
    2.动态获取截取的长度
    
    // 注意:rangeOfString是从左至右的开始查找, 只要找到就不找了
    NSUInteger length = [str rangeOfString:@"</"].location - location;
    NSRange range = NSMakeRange(location, length);
    
    NSString *newStr = [str substringWithRange:range];
    NSLog(@"str = %@", str);
    NSLog(@"newStr = %@", newStr);

    问题2:如何截取字符串?

    答:

    /*
     <head>小码哥</head> --> 小码哥</head>  --> 小码哥
     <head>小码哥</head> --> <head>小码哥  --> 小码哥
     */
    
    NSUInteger location = [str rangeOfString:@">"].location + 1;
    NSString *newStr = [str substringFromIndex:location];
    NSLog(@"newStr = %@", newStr);
    
    location = [newStr rangeOfString:@"</"].location;
    // 改变了指针的指向, 并不是修改了原来的字符串
    newStr = [newStr substringToIndex:location];
    NSLog(@"newStr = %@", newStr);

    字符串替换

    了解字符串替换方法,和怎么填方法中的参数

    stringByReplacingOccurrencesOfString:
    stringByTrimmingCharactersInSet:

    问题1:如何替换字符串中的部分字符?

    答:

    //需求: 将&符号替换为/
    NSString *str = @"http:&&www.520it.com&img&lnj.gif";
    // OccurrencesOfString: 要替换谁
    // withString: 用谁替换
    NSString *newStr = [str stringByReplacingOccurrencesOfString:@"&" withString:@"/"];
    NSLog(@"newStr = %@", newStr);

     

    问题2:如何对字符串首位进行处理?

    答:

    NSString *str = @"HTTP://www.520it.com/img/LNJ.GIF";
    
    NSCharacterSet *set = [NSCharacterSet uppercaseLetterCharacterSet];
    NSString *newStr = [str stringByTrimmingCharactersInSet:set];
    NSLog(@"newStr = |%@|", newStr);

    字符串和路径

    获取路径方法的本质

    NSString *str = @"User/lnj/Desktop/lnj.txt.jpg";

    问题1:如何判断是否是绝对路径?

    答:

    • 其实:本质就是判断字符串是否以/开头
      if([str isAbsolutePath])
      {
        NSLog(@"是绝对路径");
      }else{
        NSLog(@"不是绝对路径");
      }

    问题2:如何获取文件路径中的最后一个目录?

    答: 本质:就是获取路径中最后一个/后面的内容

    NSString *newStr = [str lastPathComponent];
    NSLog(@"%@", newStr);

     

    问题3:如何删除文件路径中的最后一个目录?

    答:

    • 本质:就是删除最后一个/后面的内容, 包括/也会被删除
      NSString *newStr = [str stringByDeletingLastPathComponent];
      NSLog(@"%@", newStr);

    问题4:如何给文件路径添加一个目录?

    答:

    • 本质:就是在字符串的末尾加上一个/ 和指定的内容
    • 注意: 如果路径后面已经有了/, 那么就不会添加了
    • 如果路径后面有多个/, 那么会自动删除多余的/, 只保留一个
    NSString *newStr = [str stringByAppendingPathComponent:@"xmg"];
    NSLog(@"%@", newStr);

     

    问题5:如何获取路径中文件的扩展名?

    答:

    • 本质:就是从字符串的末尾开始查找., 截取第一个.后面的内容
      NSString *newStr = [str pathExtension];
      NSLog(@"%@", newStr);

    问题6:如何删除路径中文件的扩展名?

    答:

    • 本质就是从字符串的末尾开始查找.,删除第一个.和.后面的内容
      NSString *newStr = [str stringByDeletingPathExtension];
      NSLog(@"%@", newStr);

    问题7:如何给文件路径添加一个扩展名?

    答:

    • 本质:就是在字符串的末尾加上一个.和指定的内容
      NSString *newStr = [str stringByAppendingPathExtension:@"jpg"];
      NSLog(@"%@", newStr);

    问题1:如何将将字符串转换为大写?

    答:

    NSString *newStr = [str uppercaseString];
    NSLog(@"%@", newStr);

     

    问题2:如何将字符串转换为小写?

    答:

    NSString *newStr2 = [newStr lowercaseString];
    NSLog(@"%@", newStr2);

     

    htpp://www.520it.com/img/lnj.GIF;

    问题3:如何将字符串的首字符转换为大写

    答:

    NSString *newStr = [str capitalizedString];
    NSLog(@"%@", newStr);

     

    问题4:如何字符串与基本数据类型的转换?

    答:

    NSString *str1 = @"110";
    NSString *str2 = @"120";
    //    str1 + str2; // 错误
    int value1 = [str1 intValue];
    int value2 = [str2 intValue];
    NSLog(@"sum = %i", value1 + value2);
    
    // 注意: 如果不是int,double,float,bool,integer,longlong这些类型就不要乱用
    NSString *str3 = @"abc";
    int value3 = [str3 intValue];
    NSLog(@"value3 = %i", value3);

    问题5:如何C语言字符串和OC字符串之间的转换?

    答:

    char *cStr = "lnj";
    NSString *str = [NSString stringWithUTF8String:cStr];
    NSLog(@"str = %@", str);
    
    NSString *newStr = @"lmj";
    const char *cStr2 = [newStr UTF8String];
    NSLog(@"cStr2 = %s", cStr2);

     

     

  • 相关阅读:
    OpenERP实施记录(12):付款处理
    OpenERP实施记录(10):采购补货
    OpenERP实施记录(9):销售一批电脑
    从一个action地址获取信息
    在线杀毒 (最大文件大小64MB)
    WIN7启动WIFI
    Lazy Load, 延迟加载图片的 jQuery 插件【备忘】
    Android 汉字转拼音之JNI篇
    Android Studio 解决方法No JVM installation found. Please install a 64-bit JDK.
    Unity3D移植到自己的Android程序
  • 原文地址:https://www.cnblogs.com/dreamWanweidong/p/4998682.html
Copyright © 2011-2022 走看看