OC学习篇之---Foundation框架中的NSString对象和NSMutableString对象
今天在在来继续看一下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 = @"8888";
- 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 = @"1";
- BOOL values = [string20 boolValue];
- //8.---------------------subStringToIndex/subStringFromIndex/subStringWithRange
- //字符串的截取
- NSString *string21 = @"abcdefg";
- //从开始位置截取到下标为3的字串(不包括3)
- NSString *stringnews = [string21 substringToIndex:3];
- //从哪个index开始截取到尾部(包括3)
- stringnews = [string21 substringFromIndex:3];
- //截取1~(3+1)部分的字串
- NSRange range = {1,3};
- 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:3];
- }
- return 0;
- }
下面来看一下他的方法:
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 = @"8888";
- 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 = @"1";
- BOOL values = [string20 boolValue];
7、字符串的截取方法
- //8.---------------------subStringToIndex/subStringFromIndex/subStringWithRange
- //字符串的截取
- NSString *string21 = @"abcdefg";
- //从开始位置截取到下标为3的字串(不包括3)
- NSString *stringnews = [string21 substringToIndex:3];
- //从哪个index开始截取到尾部(包括3)
- stringnews = [string21 substringFromIndex:3];
- //截取1~(3+1)部分的字串
- NSRange range = {1,3};
- 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:3];
二、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:0];
- //3.---------------------appendString
- //追加字符串,不会产生新的对象
- [string1 appendString:@"可变"];
- //4.---------------------deleteCharactersInRange
- //删除字符串中指定范围的字串内容
- NSMutableString *string2 = [NSMutableString stringWithString:@"hello"];
- NSRange range = {1,3};
- [string2 deleteCharactersInRange:range];
- //5.---------------------replaceCharactersInRange
- //替换字符串内容
- NSMutableString *string3 = [NSMutableString stringWithString:@"hello"];
- NSRange ranges = [string3 rangeOfString:@"ll"];//先查找出需要替换字符串的范围
- [string3 replaceCharactersInRange:ranges withString:@"ee"];
- }
- return 0;
- }
这里主要是介绍了NSMutalbeString类和NSString类不同的地方
1、创建方法
NSMutableString类的创建方式和NSString的创建方式差不多,只是有一点需要注意,NSMutableString不能使用直接方式去创建,因为直接方式创建的字符串都是在常量池中,而常量池中的值都是不可变的,所以不能创建的,同时initWithString创建出来的字符串也是不在常量池中的。这点需要和NSString区分一下
2、在字符串中插入一个字串
- //2.---------------------insertString
- //在源字符串中指定的index中插入字符串,不会产生新的对象
- [string1 insertString:@"可变" atIndex:0];
3、字符串的追加
- //3.---------------------appendString
- //追加字符串,不会产生新的对象
- [string1 appendString:@"可变"];
这个追加方法和NSString是不一样的,他不会产生一个字符串对象
4、删除字串
- //4.---------------------deleteCharactersInRange
- //删除字符串中指定范围的字串内容
- NSMutableString *string2 = [NSMutableString stringWithString:@"hello"];
- NSRange range = {1,3};
- [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对象的更多相关文章
- (转载)OC学习篇之---Foundation框架中的NSString对象和NSMutableString对象
在之前的一篇文章中我们说到了Foundation框架中的NSObject对象,那么今天在在来继续看一下Foundation框架中的常用对象:NSString和NSMutableString. 在OC中 ...
- (转载)OC学习篇之---Foundation框架中的NSArray类和NSMutableArray类
在之前的一篇文章中介绍了Foundation框架中的NSString类和NSMutableString类,今天我们继续来看一下Foundation框架中的NSArray类和NSMutableArray ...
- (转载)OC学习篇之---Foundation框架中的其他类(NSNumber,NSDate,NSExcetion)
前一篇说到了Foundation框架中的NSDirctionary类,这一一篇来看一下Foundation的其他常用的类:NSNumber,NSDate,NSException. 注:其实按照Java ...
- (转载)OC学习篇之---Foundation框架中的NSDirctionary类以及NSMutableDirctionary类
昨天学习了Foundation框架中NSArray类和NSMutableArray类,今天来看一下Foundation框架中的NSDirctionary类,NSMutableDirctionary类, ...
- (转载)OC学习篇之---Foundation框架中的NSObject对象
前一篇文章讲到了OC中的代理模式,而且前几篇文章就介绍了OC中的类相关知识,从这篇文章开始我们开始介绍Foundation框架. OC中的Foundation框架是系统提供了,他就相当于是系统的一套a ...
- OC学习篇之---Foundation框架中的其他类(NSNumber,NSDate,NSExcetion)
1.NSNumber 这个类主要是用来封装基本类型的,说到这里,就不得不说一下了: OC中的集合是不允许存入基本类型的,所以NSNumber类就诞生了,需要将基本类型封装一下,然后存进去,这个类似于J ...
- OC学习篇之---Foundation框架中的NSArray类和NSMutableArray类
我们继续来看一下Foundation框架中的NSArray类和NSMutableArray类,其实NSArray类和Java中的List差不多,算是一种数据结构,当然我们从这两个类可以看到,NSArr ...
- OC学习篇之---Foundation框架中的NSObject对象
从这篇文章开始我们开始介绍Foundation框架. OC中的Foundation框架是系统提供了,他就相当于是系统的一套api,和Java中的一些系统jar很相似,又早起的一批人开发的,内部有很多现 ...
- OC学习篇之---Foundation框架中的NSDirctionary类以及NSMutableDirctionary类
昨天学习了Foundation框架中NSArray类和NSMutableArray类:http://blog.csdn.net/jiangwei0910410003/article/details/4 ...
随机推荐
- Linux下MySQL允许远程连接以及授权命令
--针对某个库做授权 GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION; ...
- 漫漫人生路-学点Jakarta基础-Java8新特性 Stream/Lambda
背景 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利.高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk dat ...
- Onvif开发之代码框架生成篇
看了前一篇的ONVIF的简单介绍应该对它的基本使用都有了一些基本的了解了吧!下面我讲一步分解向大家介绍下如何通过gsoap生成需要的代码,以及代码中需要注意的问题[基于Linux平台 C开发] 生成O ...
- 52. nodejs报错:Cannot find module 'ejs'
转自:https://blog.csdn.net/u010142437/article/details/79012605 错误显示: Error: Cannot find module 'ejs' ...
- BZOJ 1571 DP
思路: 预处理出在能力值为i的时候 滑雪一次的最小时间 f[i][j]表示i时间 j的能力值 最多的滑雪次数 我先用vector 把课程按起点push进去 1. for(int k=0;k<ve ...
- Impala SQL
不多说,直接上干货! 其实,跟hive差不多,大家可以去参考我写的hive学习概念系列. Impala SQL VS HiveQL 下面是Impala对基础数据类型和扩展数据类型的支持 • 此外,Im ...
- zhizhang错误(每天更新更新)
做题反思(Think twice ,Code once) 1.2013NOIP转圈游戏,交代码前一定要静态查错,看看代码写得和自己意思一不一样,竟然把变量n写成了常数10,低级错误 2.2013NOI ...
- new不抛出异常nothrow与new_handler
可以看这里: http://blog.csdn.net/huyiyang2010/article/details/5984987 现在的new是会抛出异常的,bad::alloc 如果不想抛出异常两种 ...
- android 自己定义状态栏和导航栏分析与实现
效果 android 4.4之后,系统是支持自己定义状态栏和导航栏的.举个最典型的样例就是bilibiliclient了(iOS版本号和android版本号能用两套全然不一样符合各自系统的设计ui,良 ...
- js05---js实现Map
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...