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

在之前的一篇文章中我们说到了Foundation框架中的NSObject对象,那么今天在在来继续看一下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
  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、创建的方法

 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
 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、在字符串中插入一个字串

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

时间: 2024-10-18 10:45:28

(转载)OC学习篇之---Foundation框架中的NSString对象和NSMutableString对象的相关文章

OC学习篇之---Foundation框架中的NSString对象和NSMutableString对象

在之前的一篇文章中我们说到了Foundation框架中的NSObject对象: http://blog.csdn.net/jiangwei0910410003/article/details/41788121 那么今天在在来继续看一下Foundation框架中的常用对象:NSString和NSMutableString 在OC中NSString对象是不可变的,和Java中的String一样的,而NSMutableString是可变的,和Java中的StringBuilder一样. 一.NSStr

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

在之前的一篇文章中介绍了Foundation框架中的NSString类和NSMutableString类,今天我们继续来看一下Foundation框架中的NSArray类和NSMutableArray类,其实NSArray类和Java中的List差不多,算是一种数据结构,当然我们从这两个类可以看到,NSArray类是不可变的,NSMutableArray类是可变的. 下面就先来看一下NSArray类: 一.NSArray类 1 // 2 // main.m 3 // 16_NSArray 4 /

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

在之前的一篇文章中介绍了Foundation框架中的NSString类和NSMutableString类: http://blog.csdn.net/jiangwei0910410003/article/details/41788223 今天我们继续来看一下Foundation框架中的NSArray类和NSMutableArray类,其实NSArray类和Java中的List差不多,算是一种数据结构,当然我们从这两个类可以看到,NSArray类是不可变的,NSMutableArray类是可变的.

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

前一篇文章讲到了OC中的代理模式,而且前几篇文章就介绍了OC中的类相关知识,从这篇文章开始我们开始介绍Foundation框架. OC中的Foundation框架是系统提供了,他就相当于是系统的一套api,和Java中的一些系统jar很相似,又早起的一批人开发的,内部有很多现有的类和功能提供给我们使用.那么今天首先来介绍一下Foundation框架中的第一个类NSObject. 在之前介绍了类的相关知识,我们看到我们自定义的类都必须实现NSObject类,这个类内部有很多现有的方法可以供我们使用

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

昨天学习了Foundation框架中NSArray类和NSMutableArray类,今天来看一下Foundation框架中的NSDirctionary类,NSMutableDirctionary类,这个和Java中的Map类很想,OC中叫字典,Java中叫Map,还有字典是无序的,这个和NSArray不一样,Java中的Map也是无序的,通过hash值去检索元素的. 一.NSDirctionary类 1 // 2 // main.m 3 // 19_NSDictionary 4 // 5 //

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

前一篇说到了Foundation框架中的NSDirctionary类,这一一篇来看一下Foundation的其他常用的类:NSNumber,NSDate,NSException. 注:其实按照Java中集合的思想,应该还有一个Set,是的,OC中有NSSet和NSMutableSet这两个类的,但是,这里我为什么不单独介绍了呢?因为他的操作和NSArray是非常相似的,只是他和NSArray有一个区别就是他不能放重复数据,而且他也是无序的.其他没什么了,所以就不单独介绍了,而且NSSet在后面的

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

1.NSNumber 这个类主要是用来封装基本类型的,说到这里,就不得不说一下了: OC中的集合是不允许存入基本类型的,所以NSNumber类就诞生了,需要将基本类型封装一下,然后存进去,这个类似于Java中的自动装箱和拆箱,Java中的集合其实也是不允许存入基本类型的,但是我们任然看可以那么操作,就是因为有自动装箱功能,如果你将Eclipse的JDK改成5.0之前的,你看看还能操作吗.. 注:那为什么基本类型不能存入到集合中呢? 原因是在操作集合的时候会操作集合元素中的方法,但是基本类型是没有

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

昨天学习了Foundation框架中NSArray类和NSMutableArray类:http://blog.csdn.net/jiangwei0910410003/article/details/41809719,今天来看一下Foundation框架中的NSDirctionary类,NSMutableDirctionary类,这个和Java中的Map类很想,OC中叫字典,Java中叫Map,还有字典是无序的,这个和NSArray不一样,Java中的Map也是无序的,通过hash值去检索元素的.

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

前一篇文章讲到了OC中的代理模式:http://blog.csdn.net/jiangwei0910410003/article/details/41777627,而且前几篇文章就介绍了OC中的类相关知识,从这篇文章开始我们开始介绍Foundation框架. OC中的Foundation框架是系统提供了,他就相当于是系统的一套api,和Java中的一些系统jar很相似,又早起的一批人开发的,内部有很多现有的类和功能提供给我们使用.那么今天首先来介绍一下Foundation框架中的第一个类NSOb