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

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

一、NSString对象

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

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

 //
// main.m
// 14_NSString
//
// Created by jiangwei on 14-10-11.
// Copyright (c) 2014年 jiangwei. All rights reserved.
// #import <Foundation/Foundation.h> int main(int argc, const charchar * argv[]) {
@autoreleasepool {
//NSString是不可变字符串,后面还会降到可变字符串 //1.--------------字符串的创建方式
NSString *string1 = @"hello";
NSLog(@"%@",string1);
//和上面的方式是等价的
string1 = [[NSString alloc] initWithString:@"hello1"];
NSLog(@"%@",string1);
//占位符,可以实现拼接字符串
//[string1 stringByAppendingFormat:<#(NSString *), ...#>]这个方法也是可以实现字符串拼接的
string1 = [[NSString alloc] initWithFormat:@"hello %@",string1];
NSLog(@"%@",string1);
//使用类方法创建字符串
string1 = [NSString stringWithString:@"hello1"]; //2.--------------字符串的比较isEqualToString
//比较字符串的值
NSString *string2 = @"abcd";
NSString *string3 = @"";
BOOL isEquals = [string2 isEqualToString:string3];
if(isEquals){
}else{
} NSString *string8 = @"abc";
NSString *string9 = @"abc";
//这里内存做了优化,这里string8和string9是相同的,"abc"在常量区中分配的
//string8和string9是局部变量,在栈中分配内存的
if(string8 == string9){
NSLog(@"string8 == string9");
}else{
NSLog(@"string8 != string9");
} //下面的string11和string12还是在栈中分配内存的
NSString *string11 = [[NSString alloc] initWithString:@"abc"];
NSString *string12 = [[NSString alloc] initWithString:@"abc"];
if(string11 == string12){
NSLog(@"string11 == string12");
}else{
NSLog(@"string11 != string12");
} //下面的string13和string14是在堆中分配内存的,所以string13和string14不相等了
NSString *string13 = [[NSString alloc] initWithFormat:@"abc%@",@"def"];
NSString *string14 = [[NSString alloc] initWithFormat:@"abc%@",@"def"];
if(string13 == string14){
NSLog(@"string13 == string14");
}else{
NSLog(@"string13 != string14");
} //3.---------------------caseInsensitiveCompare方法
//区分大小写判断是否相等
NSString *string15 = @"zhangsan";
NSString *string16 = @"ZAHNGSAN";
NSComparisonResult result = [string15 caseInsensitiveCompare:string16];
if(result == NSOrderedSame){
}else{
} //4.---------------------compare方法
//比较两个字符串的大小
result = [string15 compare:string16];
if(result == NSOrderedAscending){
//升序
}else if(result == NSOrderedDescending){
//降序
} //5.---------------------length方法
NSString *string17 = @"abc";
NSInteger len = [string17 length];
NSLog(@"len=%ld",len); //6.---------------------uppercaseString/lowercaseString
//转成大写
NSString *string18 = @"aEc";
NSString *string19 = [string18 uppercaseString];
string19 = [string18 lowercaseString];
//首字符大写,其他的变成小写
[string18 capitalizedString]; //7.---------------------TypeXXXValue
//数值转化方法
NSString *string20 = @"3.14";
float value = [string20 floatValue];
string20 = @"";
BOOL values = [string20 boolValue]; //8.---------------------subStringToIndex/subStringFromIndex/subStringWithRange
//字符串的截取
NSString *string21 = @"abcdefg";
//从开始位置截取到下标为3的字串(不包括3)
NSString *stringnews = [string21 substringToIndex:];
//从哪个index开始截取到尾部(包括3)
stringnews = [string21 substringFromIndex:];
//截取1~(3+1)部分的字串
NSRange range = {,};
stringnews = [string21 substringWithRange:range]; //9.----------------------stringByAppendingString/stringByAppendingFormat
//字符串的追加
NSString *string22 = @"Android";
NSString *stringnew = [string22 stringByAppendingString:@"IOS"];
stringnew = [string22 stringByAppendingFormat:@"%@",@"IOS"]; //10.---------------------rangeOfString
//字符串的查找
NSString *string23 = @"www.iphonetrain.com/ios.html";
NSRange rang = [string23 rangeOfString:@"ios"];//返回一个范围
if(rang.location == NSNotFound){
//没找到
}else{
//找到了
} //11.----------------------characterAtIndex
//取出字符串中指定的char
NSString *string24 = @"abcdef";
unichar c = [string24 characterAtIndex:]; }
return ;
}

下面来看一下他的方法:

1、创建的方法

 //1.--------------字符串的创建方式
NSString *string1 = @"hello";
NSLog(@"%@",string1);
//和上面的方式是等价的
string1 = [[NSString alloc] initWithString:@"hello1"];
NSLog(@"%@",string1);
//占位符,可以实现拼接字符串
//[string1 stringByAppendingFormat:<#(NSString *), ...#>]这个方法也是可以实现字符串拼接的
string1 = [[NSString alloc] initWithFormat:@"hello %@",string1];
NSLog(@"%@",string1);
//使用类方法创建字符串
string1 = [NSString stringWithString:@"hello1"];

这里用了四种方式去创建一个字符串,我们常用的方式一般是第一种。

第二种是对象方法创建的;

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

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

2、比较字符串的值

 //2.--------------字符串的比较isEqualToString
//比较字符串的值
NSString *string2 = @"abcd";
NSString *string3 = @"";
BOOL isEquals = [string2 isEqualToString:string3];
if(isEquals){
}else{
}

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

 NSString *string8 = @"abc";
NSString *string9 = @"abc";
//这里内存做了优化,这里string8和string9是相同的,"abc"在常量区中分配的
//string8和string9是局部变量,在栈中分配内存的
if(string8 == string9){
NSLog(@"string8 == string9");
}else{
NSLog(@"string8 != string9");
}

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

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

 //下面的string11和string12还是在栈中分配内存的
NSString *string11 = [[NSString alloc] initWithString:@"abc"];
NSString *string12 = [[NSString alloc] initWithString:@"abc"];
if(string11 == string12){
NSLog(@"string11 == string12");
}else{
NSLog(@"string11 != string12");
}

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

 //下面的string13和string14是在堆中分配内存的,所以string13和string14不相等了
NSString *string13 = [[NSString alloc] initWithFormat:@"abc%@",@"def"];
NSString *string14 = [[NSString alloc] initWithFormat:@"abc%@",@"def"];
if(string13 == string14){
NSLog(@"string13 == string14");
}else{
NSLog(@"string13 != string14");
}

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

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

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

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

4、字符串的长度的方法

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

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

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

6、数值转化的方法

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

7、字符串的截取方法

 //8.---------------------subStringToIndex/subStringFromIndex/subStringWithRange
//字符串的截取
NSString *string21 = @"abcdefg";
//从开始位置截取到下标为3的字串(不包括3)
NSString *stringnews = [string21 substringToIndex:];
//从哪个index开始截取到尾部(包括3)
stringnews = [string21 substringFromIndex:];
//截取1~(3+1)部分的字串
NSRange range = {,};
stringnews = [string21 substringWithRange:range];

8、字符串的追加方法

 //9.----------------------stringByAppendingString/stringByAppendingFormat
//字符串的追加
NSString *string22 = @"Android";
NSString *stringnew = [string22 stringByAppendingString:@"IOS"];
stringnew = [string22 stringByAppendingFormat:@"%@",@"IOS"];

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

9、字符串的查找方法

 //10.---------------------rangeOfString
//字符串的查找
NSString *string23 = @"www.iphonetrain.com/ios.html";
NSRange rang = [string23 rangeOfString:@"ios"];//返回一个范围
if(rang.location == NSNotFound){
//没找到
}else{
//找到了
}

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

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

二、NSMutableString对象

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

看一下代码:

 //
// main.m
// 15_NSMutableString
//
// Created by jiangwei on 14-10-12.
// Copyright (c) 2014年 jiangwei. All rights reserved.
// #import <Foundation/Foundation.h> //NSMutableString中的内容是可以修改的
//NSMutableString是继承NSString类的
int main(int argc, const charchar * argv[]) {
@autoreleasepool { //1.--------------------创建字符串
//和NSString的创建方法相同
NSMutableString *string1 = [[NSMutableString alloc] initWithString:@"hello"]; //但是不能使用以下方式创建
//因为以下方式创建的字符串是不可变的,其值是放到常量池中的,不可变得
//NSMutableString *string1 = @"hello"; //2.---------------------insertString
//在源字符串中指定的index中插入字符串,不会产生新的对象
[string1 insertString:@"可变" atIndex:]; //3.---------------------appendString
//追加字符串,不会产生新的对象
[string1 appendString:@"可变"]; //4.---------------------deleteCharactersInRange
//删除字符串中指定范围的字串内容
NSMutableString *string2 = [NSMutableString stringWithString:@"hello"];
NSRange range = {,};
[string2 deleteCharactersInRange:range]; //5.---------------------replaceCharactersInRange
//替换字符串内容
NSMutableString *string3 = [NSMutableString stringWithString:@"hello"];
NSRange ranges = [string3 rangeOfString:@"ll"];//先查找出需要替换字符串的范围
[string3 replaceCharactersInRange:ranges withString:@"ee"];
}
return ;
}

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

1、创建方法

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

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

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

3、字符串的追加

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

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

4、删除字串

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

5、替换字符串

 //5.---------------------replaceCharactersInRange
//替换字符串内容
NSMutableString *string3 = [NSMutableString stringWithString:@"hello"];
NSRange ranges = [string3 rangeOfString:@"ll"];//先查找出需要替换字符串的范围
[string3 replaceCharactersInRange:ranges withString:@"ee"];

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

总结

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

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

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

    今天在在来继续看一下Foundation框架中的常用对象:NSString和NSMutableString 在OC中NSString对象是不可变的,和Java中的String一样的,而NSMutabl ...

  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. Android NDK 和 OpenCV 整合开发总结(3)

    Android NDK 和 OpenCV 整合开发总结(3) http://hujiaweibujidao.github.io/blog/2013/11/18/android-ndk-and-open ...

  2. Android 获取最近应用的缩略图

    最近有项需求是获取应用的缩略,用于在动画时显示.因此就对此块知识简要了解了一下. 在android中获取视频文件的缩略图有三种方法: 1.从媒体库中查询 新视频增加后需要SDCard重新扫描才能给新增 ...

  3. Eclipse 下如何引用另一个项目的资源文件

    为什么要这么做?可参考:Eclipse 下如何引用另一个项目的Java文件 下面直接说下步骤:(项目A 引用 项目B的资源文件) 1.右键 项目A,点击菜单 Properties 2.在弹出的框中,点 ...

  4. 如何理解JAVA的跨平台特性

    1.java的跨平台,是指java在运行时是凌驾于os之上,是在jvm中运行的,跟os没有直接联系. 2.java跨平台主要是由java的编译方式决定的,因为java是通过jvm先编译再执行,它编译的 ...

  5. SASS -- 基本认识

    SASS 是一种 CSS 的开发工具,提供了许多便利的写法,大大节省了设计者的时间,使得 CSS 的开发,变得简单和可维护. SASS 提供四个编译风格的选项: * nested:嵌套缩进的 css ...

  6. android 启动第三方程序的代码

      //启动媒体库 Intent i = new Intent(); ComponentName comp = new ComponentName("com.android.camera&q ...

  7. POJ 2114 - Boatherds

    原题地址:http://poj.org/problem?id=2114 题目大意: 给定一棵点数为\(n~(n \le 10000)\)的无根树,路径上有权值,给出m组询问($m \le 100$), ...

  8. POJ 1458 最长公共子序列

    子序列就是子序列中的元素是母序列的子集,且子序列中元素的相对顺序和母序列相同. 题目要求便是寻找两个字符串的最长公共子序列. dp[i][j]表示字符串s1左i个字符和s2左j个字符的公共子序列的最大 ...

  9. 软件设计之UML—UML的构成[上]

    UML是一种通用的建模语言,其表达能力相当的强,不仅可以用于软件系统的建模,而且可用于业务建模以及其它非软件系统建模.UML综合了各种面向对象方法与表示法的优点,至提出之日起就受到了广泛的重视并得到了 ...

  10. JavaScript的一些常见误区

    原文出处: 色拉油的博客   接触JavaScript两年多遇到过各种错误,其中有一些让人防不胜防,原来对JavaScript的误会如此之深,仅以此文总结一下常见的各种想当然的误区. String r ...