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

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

一、NSString对象

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

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

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

下面来看一下他的方法:

1、创建的方法

  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、比较字符串的值

  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中对于字符串有一个特殊的地方,下面来看一下代码:

  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中的原因也是类似。

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

  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类中创建字符串的方法就不一样了,比如下面的代码:

  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、比较两个字符串的大小方法

  1. //4.---------------------compare方法
  2. //比较两个字符串的大小
  3. result = [string15 compare:string16];
  4. if(result == NSOrderedAscending){
  5. //升序
  6. }else if(result == NSOrderedDescending){
  7. //降序
  8. }

4、字符串的长度的方法

  1. //5.---------------------length方法
  2. NSString *string17 = @"abc";
  3. NSInteger len = [string17 length];
  4. NSLog(@"len=%ld",len);

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

  1. //6.---------------------uppercaseString/lowercaseString
  2. //转成大写
  3. NSString *string18 = @"aEc";
  4. NSString *string19 = [string18 uppercaseString];
  5. string19 = [string18 lowercaseString];
  6. //首字符大写,其他的变成小写
  7. [string18 capitalizedString];

6、数值转化的方法

  1. //7.---------------------TypeXXXValue
  2. //数值转化方法
  3. NSString *string20 = @"3.14";
  4. float value = [string20 floatValue];
  5. string20 = @"1";
  6. BOOL values = [string20 boolValue];

7、字符串的截取方法

  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、字符串的追加方法

  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、字符串的查找方法

  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

  1. //11.----------------------characterAtIndex
  2. //取出字符串中指定的char
  3. NSString *string24 = @"abcdef";
  4. unichar c = [string24 characterAtIndex:3];

二、NSMutableString对象

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

NSMutableString

看一下代码:

  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. #import <Foundation/Foundation.h>
  9. //NSMutableString中的内容是可以修改的
  10. //NSMutableString是继承NSString类的
  11. int main(int argc, const charchar * argv[]) {
  12. @autoreleasepool {
  13. //1.--------------------创建字符串
  14. //和NSString的创建方法相同
  15. NSMutableString *string1 = [[NSMutableString alloc] initWithString:@"hello"];
  16. //但是不能使用以下方式创建
  17. //因为以下方式创建的字符串是不可变的,其值是放到常量池中的,不可变得
  18. //NSMutableString *string1 = @"hello";
  19. //2.---------------------insertString
  20. //在源字符串中指定的index中插入字符串,不会产生新的对象
  21. [string1 insertString:@"可变" atIndex:0];
  22. //3.---------------------appendString
  23. //追加字符串,不会产生新的对象
  24. [string1 appendString:@"可变"];
  25. //4.---------------------deleteCharactersInRange
  26. //删除字符串中指定范围的字串内容
  27. NSMutableString *string2 = [NSMutableString stringWithString:@"hello"];
  28. NSRange range = {1,3};
  29. [string2 deleteCharactersInRange:range];
  30. //5.---------------------replaceCharactersInRange
  31. //替换字符串内容
  32. NSMutableString *string3 = [NSMutableString stringWithString:@"hello"];
  33. NSRange ranges = [string3 rangeOfString:@"ll"];//先查找出需要替换字符串的范围
  34. [string3 replaceCharactersInRange:ranges withString:@"ee"];
  35. }
  36. return 0;
  37. }

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

1、创建方法

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

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

  1. //2.---------------------insertString
  2. //在源字符串中指定的index中插入字符串,不会产生新的对象
  3. [string1 insertString:@"可变" atIndex:0];

3、字符串的追加

  1. //3.---------------------appendString
  2. //追加字符串,不会产生新的对象
  3. [string1 appendString:@"可变"];

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

4、删除字串

  1. //4.---------------------deleteCharactersInRange
  2. //删除字符串中指定范围的字串内容
  3. NSMutableString *string2 = [NSMutableString stringWithString:@"hello"];
  4. NSRange range = {1,3};
  5. [string2 deleteCharactersInRange:range];

5、替换字符串

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

OC学习篇之---Foundation框架中的NSString对象和NSMutableString对象的更多相关文章

  1. (转载)OC学习篇之---Foundation框架中的NSString对象和NSMutableString对象

    在之前的一篇文章中我们说到了Foundation框架中的NSObject对象,那么今天在在来继续看一下Foundation框架中的常用对象:NSString和NSMutableString. 在OC中 ...

  2. (转载)OC学习篇之---Foundation框架中的NSArray类和NSMutableArray类

    在之前的一篇文章中介绍了Foundation框架中的NSString类和NSMutableString类,今天我们继续来看一下Foundation框架中的NSArray类和NSMutableArray ...

  3. (转载)OC学习篇之---Foundation框架中的其他类(NSNumber,NSDate,NSExcetion)

    前一篇说到了Foundation框架中的NSDirctionary类,这一一篇来看一下Foundation的其他常用的类:NSNumber,NSDate,NSException. 注:其实按照Java ...

  4. (转载)OC学习篇之---Foundation框架中的NSDirctionary类以及NSMutableDirctionary类

    昨天学习了Foundation框架中NSArray类和NSMutableArray类,今天来看一下Foundation框架中的NSDirctionary类,NSMutableDirctionary类, ...

  5. (转载)OC学习篇之---Foundation框架中的NSObject对象

    前一篇文章讲到了OC中的代理模式,而且前几篇文章就介绍了OC中的类相关知识,从这篇文章开始我们开始介绍Foundation框架. OC中的Foundation框架是系统提供了,他就相当于是系统的一套a ...

  6. OC学习篇之---Foundation框架中的其他类(NSNumber,NSDate,NSExcetion)

    1.NSNumber 这个类主要是用来封装基本类型的,说到这里,就不得不说一下了: OC中的集合是不允许存入基本类型的,所以NSNumber类就诞生了,需要将基本类型封装一下,然后存进去,这个类似于J ...

  7. OC学习篇之---Foundation框架中的NSArray类和NSMutableArray类

    我们继续来看一下Foundation框架中的NSArray类和NSMutableArray类,其实NSArray类和Java中的List差不多,算是一种数据结构,当然我们从这两个类可以看到,NSArr ...

  8. OC学习篇之---Foundation框架中的NSObject对象

    从这篇文章开始我们开始介绍Foundation框架. OC中的Foundation框架是系统提供了,他就相当于是系统的一套api,和Java中的一些系统jar很相似,又早起的一批人开发的,内部有很多现 ...

  9. OC学习篇之---Foundation框架中的NSDirctionary类以及NSMutableDirctionary类

    昨天学习了Foundation框架中NSArray类和NSMutableArray类:http://blog.csdn.net/jiangwei0910410003/article/details/4 ...

随机推荐

  1. .Net视图机制

    .Net会有默认的约定. HomeController下面的Index,会默认渲染Home/Index.cshtml. 当然可以设置成别的,比如设置成About. using System; usin ...

  2. Onvif开发之客户端搜索篇

    关于ONVIF的广播,有客户端搜索和服务端发现的区别:客户端向固定的网段和固定的端口发送广播消息,服务端在对应的端口回复广播请求消息本文首先介绍客户端如何进行广播的已经对广播回复的信息的基本处理. 客 ...

  3. Web跨域问题基础

    同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源策略基础之上的,浏览器只 ...

  4. #学习笔记#——JavaScript 数组部分编程(五)

    11.为数组 arr 中的每个元素求二次方.不要直接修改数组 arr,结果返回新的数组 function square(arr) { var resultArr=new Array(); for(va ...

  5. 47.Android 自己定义PopupWindow技巧

    47.Android 自己定义PopupWindow技巧 Android 自己定义PopupWindow技巧 前言 PopupWindow的宽高 PopupWindow定位在下左位置 PopupWin ...

  6. Android开发经验一判断当前屏幕是全屏还是非全屏

    public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView ...

  7. 为RecyclerView添加item的点击事件

    RecyclerView侧重的是布局的灵活性,虽说可以替代ListView但是连基本的点击事件都没有,这篇文章就来详细讲解如何为RecyclerView的item添加点击事件,顺便复习一下观察者模式. ...

  8. 7.Linux 输入子系统分析

    为什么要引入输入子系统? 在前面我们写了一些简单的字符设备的驱动程序,我们是怎么样打开一个设备并操作的呢? 一般都是在执行应用程序时,open一个特定的设备文件,如:/dev/buttons .... ...

  9. python运算符优先级表

    运算符 描述 lambda Lambda表达式 or 布尔“或” and 布尔“与” not x 布尔“非” in,not in 成员测试 is,is not 同一性测试 <,<=,> ...

  10. js课程 6-15 js简单弹力球如何实现

    js课程 6-15 js简单弹力球如何实现 一.总结 一句话总结:a.通过document的documentElement属性获取可是区域的高: b.通过增值变为负的实现到底部后反弹 1.docume ...