zoukankan      html  css  js  c++  java
  • OC学习篇之---Foundation框架中的NSString对象和NSMutableString对象

    今天在在来继续看一下Foundation框架中的常用对象:NSString和NSMutableString

    在OC中NSString对象是不可变的,和Java中的String一样的,而NSMutableString是可变的,和Java中的StringBuilder一样。

    一、NSString对象

    在OC中,NSString对象是非常重要的一个对象,也是最基础的一个对象,是用来处理字符串的常用类,和Java中的String类非常相似,而且他的一些方法也是很类似的。

    直接来看一下NSString的一些方法的使用:

    [objc] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. //  
    2. //  main.m  
    3. //  14_NSString  
    4. //  
    5. //  Created by jiangwei on 14-10-11.  
    6. //  Copyright (c) 2014年 jiangwei. All rights reserved.  
    7. //  
    8.   
    9. #import <Foundation/Foundation.h>  
    10.   
    11. int main(int argc, const charchar * argv[]) {  
    12.     @autoreleasepool {  
    13.         //NSString是不可变字符串,后面还会降到可变字符串  
    14.           
    15.         //1.--------------字符串的创建方式  
    16.         NSString *string1 = @"hello";  
    17.         NSLog(@"%@",string1);  
    18.         //和上面的方式是等价的  
    19.         string1 = [[NSString alloc] initWithString:@"hello1"];  
    20.         NSLog(@"%@",string1);  
    21.         //占位符,可以实现拼接字符串  
    22.         //[string1 stringByAppendingFormat:<#(NSString *), ...#>]这个方法也是可以实现字符串拼接的  
    23.         string1 = [[NSString alloc] initWithFormat:@"hello %@",string1];  
    24.         NSLog(@"%@",string1);  
    25.         //使用类方法创建字符串  
    26.         string1 = [NSString stringWithString:@"hello1"];  
    27.           
    28.           
    29.         //2.--------------字符串的比较isEqualToString  
    30.         //比较字符串的值  
    31.         NSString *string2 = @"abcd";  
    32.         NSString *string3 = @"8888";  
    33.         BOOL isEquals = [string2 isEqualToString:string3];  
    34.         if(isEquals){  
    35.         }else{  
    36.         }  
    37.           
    38.         NSString *string8 = @"abc";  
    39.         NSString *string9 = @"abc";  
    40.         //这里内存做了优化,这里string8和string9是相同的,"abc"在常量区中分配的  
    41.         //string8和string9是局部变量,在栈中分配内存的  
    42.         if(string8 == string9){  
    43.             NSLog(@"string8 == string9");  
    44.         }else{  
    45.             NSLog(@"string8 != string9");  
    46.         }  
    47.           
    48.         //下面的string11和string12还是在栈中分配内存的  
    49.         NSString *string11 = [[NSString alloc] initWithString:@"abc"];  
    50.         NSString *string12 = [[NSString alloc] initWithString:@"abc"];  
    51.         if(string11 == string12){  
    52.             NSLog(@"string11 == string12");  
    53.         }else{  
    54.             NSLog(@"string11 != string12");  
    55.         }  
    56.           
    57.         //下面的string13和string14是在堆中分配内存的,所以string13和string14不相等了  
    58.         NSString *string13 = [[NSString alloc] initWithFormat:@"abc%@",@"def"];  
    59.         NSString *string14 = [[NSString alloc] initWithFormat:@"abc%@",@"def"];  
    60.         if(string13 == string14){  
    61.             NSLog(@"string13 == string14");  
    62.         }else{  
    63.             NSLog(@"string13 != string14");  
    64.         }  
    65.           
    66.         //3.---------------------caseInsensitiveCompare方法  
    67.         //区分大小写判断是否相等  
    68.         NSString *string15 = @"zhangsan";  
    69.         NSString *string16 = @"ZAHNGSAN";  
    70.         NSComparisonResult result = [string15 caseInsensitiveCompare:string16];  
    71.         if(result == NSOrderedSame){  
    72.         }else{  
    73.         }  
    74.           
    75.           
    76.         //4.---------------------compare方法  
    77.         //比较两个字符串的大小  
    78.         result = [string15 compare:string16];  
    79.         if(result == NSOrderedAscending){  
    80.             //升序  
    81.         }else if(result == NSOrderedDescending){  
    82.             //降序  
    83.         }  
    84.           
    85.           
    86.         //5.---------------------length方法  
    87.         NSString *string17 = @"abc";  
    88.         NSInteger len = [string17 length];  
    89.         NSLog(@"len=%ld",len);  
    90.           
    91.           
    92.         //6.---------------------uppercaseString/lowercaseString  
    93.         //转成大写  
    94.         NSString *string18 = @"aEc";  
    95.         NSString *string19 = [string18 uppercaseString];  
    96.         string19 = [string18 lowercaseString];  
    97.         //首字符大写,其他的变成小写  
    98.         [string18 capitalizedString];  
    99.           
    100.           
    101.         //7.---------------------TypeXXXValue  
    102.         //数值转化方法  
    103.         NSString *string20 = @"3.14";  
    104.         float value = [string20 floatValue];  
    105.         string20 = @"1";  
    106.         BOOL values = [string20 boolValue];  
    107.           
    108.           
    109.         //8.---------------------subStringToIndex/subStringFromIndex/subStringWithRange  
    110.         //字符串的截取  
    111.         NSString *string21 = @"abcdefg";  
    112.         //从开始位置截取到下标为3的字串(不包括3)  
    113.         NSString *stringnews = [string21 substringToIndex:3];  
    114.         //从哪个index开始截取到尾部(包括3)  
    115.         stringnews = [string21 substringFromIndex:3];  
    116.         //截取1~(3+1)部分的字串  
    117.         NSRange range = {1,3};  
    118.         stringnews = [string21 substringWithRange:range];  
    119.           
    120.           
    121.         //9.----------------------stringByAppendingString/stringByAppendingFormat  
    122.         //字符串的追加  
    123.         NSString *string22 = @"Android";  
    124.         NSString *stringnew = [string22 stringByAppendingString:@"IOS"];  
    125.         stringnew = [string22 stringByAppendingFormat:@"%@",@"IOS"];  
    126.           
    127.           
    128.         //10.---------------------rangeOfString  
    129.         //字符串的查找  
    130.         NSString *string23 = @"www.iphonetrain.com/ios.html";  
    131.         NSRange rang = [string23 rangeOfString:@"ios"];//返回一个范围  
    132.         if(rang.location == NSNotFound){  
    133.             //没找到  
    134.         }else{  
    135.             //找到了  
    136.         }  
    137.           
    138.         //11.----------------------characterAtIndex  
    139.         //取出字符串中指定的char  
    140.         NSString *string24 = @"abcdef";  
    141.         unichar c = [string24 characterAtIndex:3];  
    142.       
    143.           
    144.     }  
    145.     return 0;  
    146. }  

    下面来看一下他的方法:

    1、创建的方法

    [objc] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. //1.--------------字符串的创建方式  
    2. NSString *string1 = @"hello";  
    3. NSLog(@"%@",string1);  
    4. //和上面的方式是等价的  
    5. string1 = [[NSString alloc] initWithString:@"hello1"];  
    6. NSLog(@"%@",string1);  
    7. //占位符,可以实现拼接字符串  
    8. //[string1 stringByAppendingFormat:<#(NSString *), ...#>]这个方法也是可以实现字符串拼接的  
    9. string1 = [[NSString alloc] initWithFormat:@"hello %@",string1];  
    10. NSLog(@"%@",string1);  
    11. //使用类方法创建字符串  
    12. string1 = [NSString stringWithString:@"hello1"];  

    这里用了四种方式去创建一个字符串

    我们常用的方式一般是第一种

    第二种是对象方法创建的

    第三种是在创建字符串的时候可以实现字符串的拼接

    第四种是使用类的方法创建的

    2、比较字符串的值

    [objc] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. //2.--------------字符串的比较isEqualToString  
    2. //比较字符串的值  
    3. NSString *string2 = @"abcd";  
    4. NSString *string3 = @"8888";  
    5. BOOL isEquals = [string2 isEqualToString:string3];  
    6. if(isEquals){  
    7. }else{  
    8. }  

    这个方法简单,没什么好说的

    但是这个方法要和我们之前说到的==方式判断相等的方式区分,==和isEqual方法一样,比较指针变量是否指向同一个对象的,但是在OC中对于字符串有一个特殊的地方,下面来看一下代码:

    [objc] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. NSString *string8 = @"abc";  
    2. NSString *string9 = @"abc";  
    3. //这里内存做了优化,这里string8和string9是相同的,"abc"在常量区中分配的  
    4. //string8和string9是局部变量,在栈中分配内存的  
    5. if(string8 == string9){  
    6.     NSLog(@"string8 == string9");  
    7. }else{  
    8.     NSLog(@"string8 != string9");  
    9. }  

    这里我们运行之后,发现用==判断也是相等的,这个原因和Java中的情形很相似,在Java中有一个常量池的概念,像这种方式创建的字符串,他们的值都是保存在一个常量池的,然后引用都是指向常量池中的那个对象,所以用==也是相等的,OC中的原因也是类似。

    但是在来看一下下面的代码:

    [objc] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. //下面的string11和string12还是在栈中分配内存的  
    2. NSString *string11 = [[NSString alloc] initWithString:@"abc"];  
    3. NSString *string12 = [[NSString alloc] initWithString:@"abc"];  
    4. if(string11 == string12){  
    5.     NSLog(@"string11 == string12");  
    6. }else{  
    7.     NSLog(@"string11 != string12");  
    8. }  

    我们发现用initWithString初始化方法创建的字符串他们的指针变量也是指向同一个对象的,所以这里要记住了,NSString类中的initWithString方法创建的字符串和NSString *str = @"demo"直接创建的方式是一样的,都是指向常量池中的一个对象。所以使用==判断是相等的,其他的NSString类中创建字符串的方法就不一样了,比如下面的代码:

    [objc] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. //下面的string13和string14是在堆中分配内存的,所以string13和string14不相等了  
    2. NSString *string13 = [[NSString alloc] initWithFormat:@"abc%@",@"def"];  
    3. NSString *string14 = [[NSString alloc] initWithFormat:@"abc%@",@"def"];  
    4. if(string13 == string14){  
    5.     NSLog(@"string13 == string14");  
    6. }else{  
    7.     NSLog(@"string13 != string14");  
    8. }  

    用initWithFormat初始化方法创建出来的对象就不想等了。

    所以要记住一点:initWithString初始化方法和直接创建字符串的效果一样,都是指向常量池中的NSString对象

    3、比较两个字符串的大小方法

    [objc] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. //4.---------------------compare方法  
    2. //比较两个字符串的大小  
    3. result = [string15 compare:string16];  
    4. if(result == NSOrderedAscending){  
    5.     //升序  
    6. }else if(result == NSOrderedDescending){  
    7.     //降序  
    8. }  


    4、字符串的长度的方法

    [java] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. //5.---------------------length方法  
    2. NSString *string17 = @"abc";  
    3. NSInteger len = [string17 length];  
    4. NSLog(@"len=%ld",len);  

    5、转化字符串的大小写方法

    [objc] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. //6.---------------------uppercaseString/lowercaseString  
    2. //转成大写  
    3. NSString *string18 = @"aEc";  
    4. NSString *string19 = [string18 uppercaseString];  
    5. string19 = [string18 lowercaseString];  
    6. //首字符大写,其他的变成小写  
    7. [string18 capitalizedString];  


    6、数值转化的方法

    [objc] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. //7.---------------------TypeXXXValue  
    2. //数值转化方法  
    3. NSString *string20 = @"3.14";  
    4. float value = [string20 floatValue];  
    5. string20 = @"1";  
    6. BOOL values = [string20 boolValue];  

    7、字符串的截取方法

    [objc] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. //8.---------------------subStringToIndex/subStringFromIndex/subStringWithRange  
    2. //字符串的截取  
    3. NSString *string21 = @"abcdefg";  
    4. //从开始位置截取到下标为3的字串(不包括3)  
    5. NSString *stringnews = [string21 substringToIndex:3];  
    6. //从哪个index开始截取到尾部(包括3)  
    7. stringnews = [string21 substringFromIndex:3];  
    8. //截取1~(3+1)部分的字串  
    9. NSRange range = {1,3};  
    10. stringnews = [string21 substringWithRange:range];  


    8、字符串的追加方法

    [objc] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. //9.----------------------stringByAppendingString/stringByAppendingFormat  
    2. //字符串的追加  
    3. NSString *string22 = @"Android";  
    4. NSString *stringnew = [string22 stringByAppendingString:@"IOS"];  
    5. stringnew = [string22 stringByAppendingFormat:@"%@",@"IOS"];  

    这里需要注意的是,每次追加完一个字符串之后,是返回一个新的字符串,因为NSString是不可变类。和Java中的String类很类似,如果用+去连接字符串都会重新创建一个字符串对象,Java中可以使用StringBuilder对象去解决这样的问题,在OC中也是有解决的,后面会说到一个可变字符串类


    9、字符串的查找方法

    [objc] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. //10.---------------------rangeOfString  
    2. //字符串的查找  
    3. NSString *string23 = @"www.iphonetrain.com/ios.html";  
    4. NSRange rang = [string23 rangeOfString:@"ios"];//返回一个范围  
    5. if(rang.location == NSNotFound){  
    6.     //没找到  
    7. }else{  
    8.     //找到了  
    9. }  

    11、取出字符串中指定的char

    [objc] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. //11.----------------------characterAtIndex  
    2. //取出字符串中指定的char  
    3. NSString *string24 = @"abcdef";  
    4. unichar c = [string24 characterAtIndex:3];  

    二、NSMutableString对象

    上面介绍了NSString对象的一些常用方法,但是OC中的NSString是不可变的对象,所以这里在介绍一下一个与其对应的可变对象:

    NSMutableString

    看一下代码:

    [objc] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. //  
    2. //  main.m  
    3. //  15_NSMutableString  
    4. //  
    5. //  Created by jiangwei on 14-10-12.  
    6. //  Copyright (c) 2014年 jiangwei. All rights reserved.  
    7. //  
    8.   
    9. #import <Foundation/Foundation.h>  
    10.   
    11. //NSMutableString中的内容是可以修改的  
    12. //NSMutableString是继承NSString类的  
    13. int main(int argc, const charchar * argv[]) {  
    14.     @autoreleasepool {  
    15.           
    16.         //1.--------------------创建字符串  
    17.         //和NSString的创建方法相同  
    18.         NSMutableString *string1 = [[NSMutableString alloc] initWithString:@"hello"];  
    19.           
    20.         //但是不能使用以下方式创建  
    21.         //因为以下方式创建的字符串是不可变的,其值是放到常量池中的,不可变得  
    22.         //NSMutableString *string1 = @"hello";  
    23.           
    24.           
    25.         //2.---------------------insertString  
    26.         //在源字符串中指定的index中插入字符串,不会产生新的对象  
    27.         [string1 insertString:@"可变" atIndex:0];  
    28.           
    29.           
    30.         //3.---------------------appendString  
    31.         //追加字符串,不会产生新的对象  
    32.         [string1 appendString:@"可变"];  
    33.           
    34.           
    35.         //4.---------------------deleteCharactersInRange  
    36.         //删除字符串中指定范围的字串内容  
    37.         NSMutableString *string2 = [NSMutableString stringWithString:@"hello"];  
    38.         NSRange range = {1,3};  
    39.         [string2 deleteCharactersInRange:range];  
    40.           
    41.           
    42.         //5.---------------------replaceCharactersInRange  
    43.         //替换字符串内容  
    44.         NSMutableString *string3 = [NSMutableString stringWithString:@"hello"];  
    45.         NSRange ranges = [string3 rangeOfString:@"ll"];//先查找出需要替换字符串的范围  
    46.         [string3 replaceCharactersInRange:ranges withString:@"ee"];  
    47.     }  
    48.     return 0;  
    49. }  

    这里主要是介绍了NSMutalbeString类和NSString类不同的地方

    1、创建方法

    NSMutableString类的创建方式和NSString的创建方式差不多,只是有一点需要注意,NSMutableString不能使用直接方式去创建,因为直接方式创建的字符串都是在常量池中,而常量池中的值都是不可变的,所以不能创建的,同时initWithString创建出来的字符串也是不在常量池中的。这点需要和NSString区分一下

    2、在字符串中插入一个字串

    [objc] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. //2.---------------------insertString  
    2. //在源字符串中指定的index中插入字符串,不会产生新的对象  
    3. [string1 insertString:@"可变" atIndex:0];  


    3、字符串的追加

    [objc] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. //3.---------------------appendString  
    2. //追加字符串,不会产生新的对象  
    3. [string1 appendString:@"可变"];  

    这个追加方法和NSString是不一样的,他不会产生一个字符串对象

    4、删除字串

    [objc] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. //4.---------------------deleteCharactersInRange  
    2. //删除字符串中指定范围的字串内容  
    3. NSMutableString *string2 = [NSMutableString stringWithString:@"hello"];  
    4. NSRange range = {1,3};  
    5. [string2 deleteCharactersInRange:range];  


    5、替换字符串

    [java] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. //5.---------------------replaceCharactersInRange  
    2. //替换字符串内容  
    3. NSMutableString *string3 = [NSMutableString stringWithString:@"hello"];  
    4. NSRange ranges = [string3 rangeOfString:@"ll"];//先查找出需要替换字符串的范围  
    5. [string3 replaceCharactersInRange:ranges withString:@"ee"];  

    从上面的这些方法中,我们也可以看到NSMutableString类是可变的,因为只有可变字符串是有增删改查操作的

    总结

    这篇文章就介绍了Foundation框架中的字符串对象,有可变NSMutableString和不变NSString之分。

  • 相关阅读:
    性能优化方法
    JSM的topic和queue的区别
    关于分布式事务、两阶段提交协议、三阶提交协议
    大型网站系统与Java中间件实践读书笔记
    Kafka设计解析:Kafka High Availability
    kafka安装和部署
    String和intern()浅析
    JAVA中native方法调用
    Java的native方法
    happens-before俗解
  • 原文地址:https://www.cnblogs.com/dreamDeveloper/p/6024608.html
Copyright © 2011-2022 走看看