黑马程序员--OC学习篇之Foundation框架中的NSString对象和NSMutableString对象

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、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之分。

技术选型 【后端】:Java 【框架】:springboot 【前端】:vue 【JDK版本】:JDK1.8 【服务器】:tomcat7+ 【数据库】:mysql 5.7+ 项目包含前后台完整源码。 项目都经过严格调试,确保可以运行! 具体项目介绍可查看博主文章或私聊获取 助力学习实践,提升编程技能,快来获取这份宝贵的资源吧! 在当今快速发展的信息技术领域,技术选型是决定一个项目成功与否的重要因素之一。基于以下的技术栈,我们为您带来了一份完善且经过实践验证的项目资源,让您在学习和提升编程技能的道路上事半功倍。以下是该项目的技术选型和其组件的详细介绍。 在后端技术方面,我们选择了Java作为编程语言。Java以其稳健性、跨平台性和丰富的库支持,在企业级应用处于领导地位。项目采用了流行的Spring Boot框架,这个框架以简化Java企业级开发而闻名。Spring Boot提供了简洁的配置方式、内置的嵌入式服务器支持以及强大的生态系统,使开发者能够更高效地构建和部署应用。 前端技术方面,我们使用了Vue.js,这是一个用于构建用户界面的渐进式JavaScript框架。Vue以其易上手、灵活和性能出色而受到开发者的青睐,它的组件化开发思想也有助于提高代码的复用性和可维护性。 项目的编译和运行环境选择了JDK 1.8。尽管Java已经推出了更新的版本,但JDK 1.8依旧是一种成熟且稳定的选择,广泛应用于各类项目,确保了兼容性和稳定性。 在服务器方面,本项目部署在Tomcat 7+之上。Tomcat是Apache软件基金会下的一个开源Servlet容器,也是应用最为广泛的Java Web服务器之一。其稳定性和可靠的性能表现为Java Web应用提供了坚实的支持。 数据库方面,我们采用了MySQL 5.7+。MySQL是一种高效、可靠且使用广泛的关系型数据库管理系统,5.7版本在性能和功能上都有显著的提升。 值得一提的是,该项目包含了前后台的完整源码,并经过严格调试,确保可以顺利运行。通过项目的学习和实践,您将能更好地掌握从后端到前端的完整开发流程,提升自己的编程技能。欢迎参考博主的详细文章或私信获取更多信息,利用这一宝贵资源来推进您的技术成长之路!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值