OC基础-NSString的用法06

来源:互联网 发布:npm 淘宝镜像 编辑:程序博客网 时间:2024/05/16 10:42


1.  Objective+C 中的字符串


    OC,我们使用 NSString类型的指针来保存 1个字符串对象的地址.

    OC 中的字符串我们使用 1@前缀来表示.

    NSString 其实是 Foundation框架中的 1个类.字符串以 NSString对象的形式保存.


2.  如何初始化NSString


    1). 直接为 NSString指针变量初始化 1 OC字符串常量.


        NSString *str = @"jack";


    2). 使用new、或者 alloc来创建 1个空的字符串对象.@"".


        NSString *str = [NSString new];

        NSString *str = [[NSString alloc] init]; 这两种创建字符串对象的方式.创建出来的字符串是@"".空的字符串.


    3). 调用 NSString的类方法来快速得到 1个字符串对象.


        a). 得到 1个空的字符串对象.@""

            NSString *str = [NSString string];

        b). 使用格式控制字符串拼接 1个新的字符串对象.

            NSString *str = [NSString stringWithFormat:@"字符串数据使用格式控制符",变量列表];


3.字符串的恒定性.


    1).字符串对象的存储.


    如果是以字符串常量去初始化 1 NSString指针.那么这个字符串常量是存储在常量区之中的.如果是以调用 NSString的类方法来得到 1个字符串对象,这个对象就创建在堆区.


    2). 一旦在内存中创建 1个字符串对象,这个字符串对象就具备恒定性.就是这个字符串的内容无法更改.


        当我们重新为这个 NSString指针赋值 1个字符串数据的时候,是重新创建了 1个字符串对象,将这个对象的地址赋值给这个指针.当需要在常量区存储 1个字符串常量数据的时候,系统会先检查常量区中是否有相同内容的字符常量.如果有,直接指向,如果没有才会重新创建.


    3). 需要注意的是.如果是通过 NSString的类方法来创建 1个字符串对象.这个字符串对象,无论如何是存储在堆区的


        NSString *str = NSString stringWithFormat:@"jacklove%@",@"rose"];//这个字符串对象是存储在堆区的. str = @"lilei";// str重新赋值.不会改变上面的字符串对象.上面的字符串对象不会发生变化.而是.先查看常量区中是否有@"lilei"这个字符串,如果有直接将其地址赋值给 str 如果没有才重新创建.


4.NSString常用方法.


    将字符串写入到指定的文件中


    - (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error;


    参数解释:

    1个参数:路径.


    要将字符串写入到 1个文件之中.


    2个参数:保证原子性.


    如果为YES则会先创建 1个临时文件,将内容写到这个临时文件中.如果成功再将临时文件拷贝到指定的目录.这样做的好处是安全,不易出错.但是效率较低.如果为NO,直接将字符       串写到指定的文件之中.这样写不安全但是效率高.建议使用NO.


    3个参数:以哪种字符编码将字符串数据写入到文件,这里传入:NSUTF8StringEncoding


    4个参数:二级指针.传入 1 NSError 1个二级指针.


    如果方法执行成功.则方法执行完毕之后.这个 NSError的指针的值为nil如果方法执行失败.则方法执行完毕之后这个 NSErro指针会指向 1个错误对象.可以打印这个错误对          象得到发生错误的详细信息.

    调用 NSError对象的 localizedDescription方法可以拿到发生错误的简要发生原因.

    所以,判断是否写入成功就可以判断这个 NSError指针是否为nil如果为nil说明写入成功,如果不为nil就说明写入失败.

    返回值BOOL.代表是否写入成功.


    从指定文件中读取字符串数据


    + (nullableinstancetype)stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error;


    nullable代表返回的对象有可能是nil


    参数解释:


    1个参数:路径


        要读取那 1个文件中的字符串数据.


    2个参数:使用的字符编码


        建议使用 NSUTF8StringEncoding

    3个参数:二级指针.传入 1 NSError 1个二级指针.


        如果方法执行成功.则方法执行完毕之后.这个 NSError的指针的值为nil

        如果方法执行失败.则方法执行完毕之后这个 NSErro指针会指向 1个错误对象.可以打印这个错误对象得到发生错误的详细信息.

        所以,判断是否读取成功就可以判断这个 NSError指针是否为nil如果为nil说明读取成功,如果不为nil就说明读取失败.

        返回值是 NSString返回的是从指定文件中读取出来的字符串数据.


   使用NSURL读写字符串数据.


        1).读写字符串数据的时候.路径可以是本地磁盘路径,也可以是 1 个网址,还可以是 1 ftp文件的地址.


           我们使用 1 NSURL对象来描述这样 1个地址.本地路径的网址的 ftp文件的地址.

           我们就可以通过这个 NSURL对象存储的地址信息来读写字符串.


        2). 不同的 URL的写法,根据协议区分.


            本地文件: file://绝对路径

            网址: http://网址或者 https://网址.

            ftp: ftp://文件地址


        3). 将地址信息包装在 1 NSURL对象之中.


            -> 将本地文件路径封装在 NSURL对象之中.

            NSURL *url = [NSURL URLWithString:@"file:///Users/Highven/Desktop/123.txt"];


            -> 将网页地址路径封装在 NSURL对象之中.

            NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];


            -> ftp文件路径封装在 NSURL对象之中.

            NSURL *url = [NSURL URLWithString:@"ftp://XXXXXXX/cjk.txt"];


        4). 读取 NSURL对象中保持的路径的文件数据.

          + (nullableinstancetype)stringWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error:(NSError **)error;


            1个参数:封装了地址的 NSURL对象.


            2个参数:编码方式,一般传递 NSUTF8StringEncoding


            3个参数:二级指针.传入 1 NSError 1个二级指针.


            如果方法执行成功.则方法执行完毕之后.这个 NSError的指针的值为nil

            如果方法执行失败.则方法执行完毕之后这个 NSErro指针会指向 1个错误对象.可以打印这个错误对象得到发生错误的详细信息.

            所以,判断是否读取成功就可以判断这个 NSError指针是否为nil如果为nil说明读取成功,如果不为nil就说明读取失败.

            返回值.为读取到的字符串数据.


            如果 NSURL对象中保存的地址是本地文件的地址.就会去指定的本地文件中读取字符串数据.

            如果 NSURL对象中保存的地址是 1个网页地址.就会去下载这个网页的源代码.

            如果 NSURL对象中保存的地址是 1 ftp文件地址.就会去下载这个文件的内容.



      NSURL对象保持的地址写入字符串数据.


      需要注意的是,不能向网页、ftp写入字符数据.除非你拥有写入的权限.

      - (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error;

        1个参数:封装了地址的 NSURL对象.


        2个参数:保证原子性.


        如果为YES则会先创建 1个临时文件,将内容写到这个临时文件中.如果成功再将临时文件拷贝到指定的目录.这样做的好处是安全,不易出错.但是效率较低.如果为NO,直接将字符串写到指定的文件之中.这样写不安全但是效率高.建议使用NO.


        3个参数:以哪种字符编码将字符串数据写入到文件


           这里传入:NSUTF8StringEncoding


        4个参数:二级指针.传入 1 NSError 1个二级指针.


            如果方法执行成功.则方法执行完毕之后.这个 NSError的指针的值为nil如果方法执行失败.则方法执行完毕之后这个 NSErro指针会指向 1个错误对象.可以打印这个错误对象得到发生错误的详细信息.

            调用 NSError对象的 localizedDescription方法可以拿到发生错误的简要发生原因.所以,判断是否写入成功就可以判断这个 NSError指针是否为nil

            如果为nil 说明写入成功,如果不为nil 就说明写入失败.返回值BOOL.代表是否写入成功.


        字符串的比较




        1).  字符串比较的第一种方式.调用字符串对象的 compare:方法

        - (NSComparisonResult)compare:(NSString *)string;


        比较的原理 ASCII 比较两个字符串的第 0个字符的 ASCII的大小.如果相等再比较下 1.


        返回值是 1NSComparisonResut类型的枚举.


        实际上,你完全可以使用 1int类型的变量来接收这个结果.

        如果返回的是:1 说明当前这个字符串小于传入的字符串.

        如果返回的是说明当前字符串和传入的字符串的内容是相等的.

        如果返回的是说明当前字符串和传入的字符串大大于的.

        NSNumericSearch:  比较的是两个同样格式的字符串中,数字的大小.



        2).  比较字符串的第二种方式:

        - (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask;


          指定比较选项.

          options 参数枚举类型指定比较选项

            NSCaseInsensitiveSearch:  忽略大小写的比较.

            NSLiteralSearch:  完全匹配的比较.

      


       字符串相等的判断

        1).  1个非常严肃的问题.

        就是判断两个字符串的内容是否相同,能否使用  == 比较运算符来判断.

          首先,我们要搞清楚  == 比较运算符的作用是什么?

           ==  运算符是用来比较两边的两个数据是否是相等的.

          如果==运算符的两边是 1个变量的话.那么比较的是两个变量的值是否相等.

          如果使用==比较的是两个指针变量呢比较的是这两个指针变量的值仍然比较的是变量的值.


          如果比较的是两个 NSString的指针变量呢?


        所以,如果要判断两个字符串相等,不应该判断字符串的指针的值是否相等.而是应该判断指针指向的字符串对象中的内容是否相等.


        2).判断 NSString指针指向的字符串对象的内容是否相等.

        - (BOOL)isEqualToString:(NSString *)aString;


    NSRange 概述

        NSRange Foundation框架中比较常用的结构体.它的定义如下.


        NSUInteger  的定义如下:



        一个 NSRange结构体变量表示 1段范围通常情况下,用来表示 1个子字符串在主字符串中的范围.

        该结构体有两个成员:

        location  表示这个范围的起始位置下标.

        length:  表示该范围内的长度.



        声明并初始化结构体变量的方式.


        1). 最原始的方式.

        NSRange range;

        range.location = 3;

        range.length = 4;


        2). 第二种方式:    NSRange range = {3, 7};

        3). 第三种方式:   NSRange range = {.location = 3,.length = 7};



        4). Foundation框架中定义了1个函数.这个函数可以快速的创建1NSRange结构体会,


        NSRange range =  NSMakeRange(loc, len);

        返回1个指定属性的NSRange结构体变量.



        5). Foundation框架中定义了1个函数可以将1NSRange结构体变量转换为NSString


        NSStringFromRange(ran) 函数可以将NSRange结构体变量转换为指定格式的字符串.




    判断 1个字符串中是否包含 1个子字符串.


    - (NSRange)rangeOfString:(NSString *)searchString;


    举个例子. @”我爱北京判断这个字符串中是否有  @”爱北” 这个子字符串.

    

    返回值是 1 NSRange 1个结构体数据.代表子字符串在字符串中的范围.

    这个方法,会返回这么 1个结构体变量,表示子字符串在主字符串中的范围.

    location :  代表子字符串在主字符串中第 1次出现的下标.如果没有找到,就将是最大值.

    length:  代表子字符串在主字符串中匹配的字符个数的长度,如果没有找到则为如果找到了和子字符串的长度一致.

    所以,判断主字符串中是否包含子字符串,只需要判断返回的 NSRange 结构体变量的 length是否为 0就可以.

    !  也可以查找主字符串中子字符串最后 1次出现的范围.

    - (NSRange)rangeOfString:(NSString *)searchString options:(NSStringCompareOptions)mask;

     mask 设置为 NSBackwardsSearch


    字符串的截取


        1个字符串中,取出 1个子字符串来.


         从字符中指定的下标截取到最后.


         - (NSString *)substringFromIndex:(NSUInteger)from;

        参数传入 1个下标,就从这个下标开始一直截取到最后.


        从第 0个元素截取到指定的下标.


        - (NSString *)substringToIndex:(NSUInteger)to;

        参数:传入 1个下标,就会从第 0个元素截取到这个下标处.不包括这个下标的字符



        从字符串中截取 1个范围的子字符串.


        - (NSString *)substringWithRange:(NSRange)range; 截取指定的1段范围.

        参数传入 1 NSRange结构体变量 表示要从主字符串的那 1个位置开始截取多少个长度的子字符串.



    字符串的替换

        - (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement


        将字符串中第1个参数替换为第2个参数.友情提示:原来的指针指向字符串的内容是不会变的 会全部替换.

        新串是以方法的返回值返回的.


        这个方法还可以做删除.原理:将其替换为@""




    去掉字符串前后的空格.

        str =  [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

        中间的空格无法去掉.


    获取字符串中的每一个字符


        @“jacklove 小花”. 要取出这个字符串中的每 1个字符.或者指定下标的字符.


        - (unichar)characterAtIndex:(NSUInteger)index;

        传入 1 NSUInteger的参数.就会返回这个下标处的字符返回值是 unichar类型的.这个类型的字符支持中文.

        输出 unichar变量中的字符数据使用格式控制符  %C 看清楚是大写的 C


    字符串数据转换为其他的类型.使用频率很高.


        @property (readonly)double doubleValue;

        @property (readonly)float floatValue;

        @property (readonly)int intValue;

        @property (readonly) NSInteger integerValue

        @property (readonly)long long longLongValue

        @property (readonly)BOOL boolValue


        需要特别注意 1点是如果字符串的字面量不是纯的数字.在转换的时候能转换多少是多少比如:    @”12a” 转换为int  12        

         @“a12”  是无法转换为int  所以就返回 0


    OC字符串转换为 C语言的字符串 


        NSString *ttt=@"aaaa";

        char* aaa=ttt.UTF8String


    C语言的字符串转换为 OC的字符串


        + (nullableinstancetype)stringWithUTF8String:(constchar *)nullTerminatedCString;



    得到字符串的长度  

       调用字符串对象的 length方法就可以.


        @property (readonly) NSUInteger length;


    去除字符串的前后空格


        - (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set;


        [ttt stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

    将字符串转换为大写字符串


        @property (readonly,copy) NSString *uppercaseString;



    将字符串转换为小写字符串.


        @property (readonly,copy) NSString *lowercaseString;



    去掉字符串前后的小写字母


        - (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set;


        [ttt stringByTrimmingCharactersInSet:[NSCharacterSet lowercaseLetterCharacterSet]];


    去掉字符串前后的大写字母


        - (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set;


        [ttt stringByTrimmingCharactersInSet:[NSCharacterSet uppercaseLetterCharacterSet]];


    去掉头尾指定的字符串.


        - (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set;


       [ttt stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"abcdef"]];


原创粉丝点击