Foundation框架-NSString和NSMutableString

可变与不可变的字符串

--1-- Foundation框架介绍
1.1 框架介绍
--2-- NSString
2.1 NSString介绍及使用
2.2 NSString创建方式 
2.3 从文件中读取/存储字符串
2.4 字符串的比较
2.5 前后缀检查及搜索
2.6 字符串的截取和替换
2.7 获取字符串的每个字符
2.8 字符串和其他数据类型转换
2.9 NSString去除空格 
--3-- NSMutableString
3.1 NSMutableString 基本概念
3.2 字符串中的可变和不可变 
3.3 NSMutableString常用方法
3.4 字符串的使用注意 
--------------------------------------
 

【写在开头:】

『Foundation框架是Mac\iOS中其他框架的基础,在Foundation框架中,几乎所有的类都是以NS开头的。NSString和NSMutableString是Foundation框架中处理字符串的类』

--1-- Foundation框架介绍

1.1 框架介绍

框架是由许多类、方法、函数、文档按照一定的逻辑组织起来的集合。

在OS X下的Mac操作系统中大约有80个框架为所有程序开发奠定基础的框架称为Foundation 框架。

Foundation框架允许使用一些基本对象,如数字和字符串,以及一些对象集合,如数组,字 典和集合,其他功能包括处理日期和时间、内存管理、处理文件系统、存储(或归档)对象、处理几何数据结构(如点和长方形)。

  Cocoa是Foundation和AppKit

  Cocoa Touch是Foundation和UIKit

Foundation框架是Mac\iOS中其他框架的基础

--2-- NSString

2.1 NSString介绍及使用

一个NSString对象就代表一个字符串,一般称NSString为字符串类。

2.2 NSString创建方式

NSString的创建方式比较多

1) 最直接的方式(这是常量字符串)

NSString *str = @"abc"; //存储在常量区
NSString *str2 = @"abc";

NSString *str3 = @"aaa";

NSLog(@"str->%p", str); //0x100001058
NSLog(@"str2->%p", str2); //0x100001058

NSLog(@"str3->%p", str3); //0x100001078

这是也是常量区的特点,当有相同的字符串常量时就不再分配存储空间,如这里的str和str2。

2) 格式化的方式

NSString *str4 = [NSString stringWithFormat:@"abc"]; //堆区
NSLog(@"str4->%p", str4); //0x63626135
//可以看出,使用格式化方式创建字符串是保存在内存的堆区中

2.3 从文件中读取/存储字符串

- writeToFile:将字符串写入文件中

+ stringWithContentsOfFile: 读取文件中的字符串并返回字符串对象

        NSString *str = @"听雨"; //字符串内容
        NSError *err; //定义error对象

        //*************从写入字符串到文件中
        [str writeToFile:@"/Users/lsrain/Desktop/test.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];

        //************* 从文件中读取字符串显示到控制台上
        NSString *str5 = [NSString stringWithContentsOfFile:@"/Users/lsrain/Desktop/test.txt" encoding:NSUTF8StringEncoding error:&err];

        //如果读取到内容了,则err为nil
        if (err == nil) {
            NSLog(@"读取成功的情况");
            NSLog(@"%@",str5);
        }else {
            NSLog(@"读取失败的情况");
            //打印err的信息
            NSLog(@"%@",[err localizedDescription]);

2.4 字符串的比较

字符串根据排列顺序的不同,会有大小的差异,如果要比较两个字符串的大小的话,可以使用compare方法。

- compare 方法返回的结果有三种:

NSOrderedAscending,NSOrderedSame,NSOrderedDescending 分别是升序、相等和降序

        NSString *str = @"adc";
        NSString *str2 = @"ADc";
        NSComparisonResult result = [str compare:str2];
        switch (result) { //NSComparisonResult是一个枚举值
            case NSOrderedDescending: //降序
                NSLog(@"str > str2");
                break;
            case NSOrderedAscending:
                NSLog(@"str < str2");
                break;
            case NSOrderedSame:
                NSLog(@"str == str2");
                break;
        }

另外,在使用compare方法时可以添加参数来决定是否区分大小写,或者声明为比较字符串个数而不是字符值等比较条件。

如果要忽略大小写的话,可以在options 里面加一个参数NSCaseInsensitiveSearch;

        NSString *str = @"adc";
        NSString *str2 = @"ADc";
        //NSCaseInsensitiveSearch是一个位枚举值,加上后忽略大小写
        NSComparisonResult result = [str compare:str2 options:NSCaseInsensitiveSearch];
        switch (result) { //NSComparisonResult是一个枚举值
            case NSOrderedDescending: //降序
                NSLog(@"str > str2");
                break;
            case NSOrderedAscending:
                NSLog(@"str < str2");
                break;
            case NSOrderedSame:
                NSLog(@"str == str2");
                break;
        }

常用的3个参数

NSCaseInsensitiveSearch:不区分大小写字符。

NSLiteralSearch:进行完全比较,区分大小写(默认)。

NSNumericSearch:比较字符串的字符个数,而不是字符值。

  可以使用"|"来同时满足多个条件

如,要忽略大小写但按字符个数的多少正确排列,那么可以这么写:

        NSString *str = @"adc";
        NSString *str2 = @"ADcd";
        //忽略大小写,按照长度来比较。使用“|”隔开多个参数
        NSComparisonResult result = [str compare:str2 options:NSCaseInsensitiveSearch|NSNumericSearch];
        switch (result) { //NSComparisonResult是一个枚举值
            case NSOrderedDescending: //降序
                NSLog(@"str > str2");
                break;
            case NSOrderedAscending:
                NSLog(@"str < str2");
                break;
            case NSOrderedSame:
                NSLog(@"str == str2");
                break;
        }

判断字符串是否相等

使用“==”判断的是两个字符串的地址是否相等。所以比较字符串是否相等应该用 - isEqualToString:方法

 @autoreleasepool {

        NSString *str = @"adc";
        NSString *str2 = @"ADcd";

        //判断两个字符串是否相等
        NSLog(@"%d", [str isEqualToString:str2]); //0 不相等
    }

2.5 前后缀检查及搜索

检查:

  1)检查字符串是否以另一个字符串开头

  -(BOOL) hasPrefix: (NSString *) aString;

@autoreleasepool {

        NSString *str = @"http://www.google.com";

        //检查是否以http://开头
        NSLog(@"%d", [str hasPrefix:@"http://"]); //是 返回1
    }

  2)判断字符串后缀

  判断字符串是否以另一个字符串结尾

  -(BOOL) hasSuffix: (NSString *) aString;

    @autoreleasepool {

        NSString *str = @"http://www.google.com/images/logo.jpg";

        //检查是否以.jpg结尾
        NSLog(@"%d", [str hasSuffix:@".jpg"]); //是 返回1
    }

查找:

  - (NSRange)rangeOfString:(NSString *)aString;

  用来检查字符串内容中是否包含了aString

如果包含aString, 则返回aString在字符串中第一次出现的范围 :

@autoreleasepool {

        NSString *str = @"http://www.google.com/images/logo.jpg";
        NSString *keyStr = @"google"; //要搜索的字符串

        //查找并返回范围
        NSRange range = [str rangeOfString:keyStr];

        if (range.location != NSNotFound){ //NSNotFound是const的常量 NSIntegerMax
            //找到
            NSLog(@"range = %@", NSStringFromRange(range)); //range = {11, 6}
        } else{
            NSLog(@"没有找到%@", keyStr);
        }

        //反向搜索 NSBackwardsSearch
        range = [str rangeOfString:keyStr options:NSBackwardsSearch];
        if (range.location != NSNotFound){ //NSNotFound是const的常量 NSIntegerMax
            //找到
            NSLog(@"反向搜索 range = %@", NSStringFromRange(range)); //range = {11, 6}
        } else{
            NSLog(@"没有找到%@", keyStr);
        }

        //发现,正常查找和反向查找的结果是一样的,只是搜索时的查找方向不同

    }

2.6 字符串的截取和替换

截取:

- (NSString *)substringFromIndex:(NSUInteger)from; 从指定位置from开始(包括指定位置的字符)到尾部

- (NSString *)substringToIndex:(NSUInteger)to; 从字符串的开头一直截取到指定的位置to,但不包括该位置的字符

- (NSString *)substringWithRange:(NSRange)range; 按照所给出的NSRange从字符串中截取子串

@autoreleasepool {

        //将标签内的字符串取出来
        NSString *str = @"<itcast>谷歌</itcast>";

        //分析:先截取">",再截取"</"
        NSUInteger location = [str rangeOfString:@">"].location + 1; //开始位置
        NSUInteger len = [str rangeOfString:@"</"].location - location; //长度

        NSRange range = {.location = location, .length = len};
        NSString *subString = [str substringWithRange:range]; //截取出的字符串

        NSLog(@"subString = %@", subString); //谷歌
    }

替换:

- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement;

将replacement替换target

    @autoreleasepool {

        //将http:**www.google.cn*images*logo*view.jpg中的*替换为/
        NSString *str = @"http: **  www.google.cn *images* logo*view.jpg";

        //分析:先替换空格,再替换“*”
        str = [str stringByReplacingOccurrencesOfString:@" " withString:@""];
        str = [str stringByReplacingOccurrencesOfString:@"*" withString:@"/"];

        NSLog(@"str = %@", str);
    }

2.7 获取字符串的每个字符

- (NSUInteger)length; 返回字符串的长度(有多少个字符,无论中文字符、英文字符等等,一个字符就是一个字符)

- (unichar)characterAtIndex:(NSUInteger)index; 返回index位置对应的字符

NSString *str = @"你好,iOS";

NSLog(@"str.len = %ld", [str length]); //6
NSLog(@"str.index 3 = %c", [str characterAtIndex:3]); //i

2.8 字符串和其他数据类型转换

@property(readonly) double doubleValue

@property(readonly) float floatValue

@property(readonly) int intValue

@property(readonly) NSInteger integerValue

        NSString *str = @"8";
        NSString *str2 = @"3.14";
        NSString *str3 = @"15926.88";

        //将对象转换成基本数据类型进行计算
        NSLog(@"str + 1 = %d", str.intValue + 1); //9
        NSLog(@"str2 + 1.2 = %.2f", str2.floatValue + 1.2f); //4.34
        NSLog(@"str3 + 1.3 = %.2f", str3.doubleValue + 1.3f); //15928.18

2.9 NSString去除空格

去除首尾的空格

[str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

NSCharacterSet

+ (id)whitespaceCharacterSet; //去掉头尾空格

+ (id)lowercaseLetterCharacterSet; // 去掉头尾的小写字母

+ (id)uppercaseLetterCharacterSet; //去掉头尾的大写字母

+ (id)characterSetWithCharactersInString:(NSString *)aString; // 去掉头尾的指定字符串

        NSString *str = @"       hello, wold ";
        NSString *str2 = @"hello, Wold";
        NSString *str3 = @"hello, WolD";
        NSString *str4 = @"D";

        //去掉头尾空格
        NSLog(@"str-->%@", [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]); //-->hello, wold

        //lowercaseLetterCharacterSet 去掉头尾的小写字母
        NSLog(@"str2-->%@", [str2 stringByTrimmingCharactersInSet:[NSCharacterSet lowercaseLetterCharacterSet]]); //-->, W 注意,这里如果首尾都是用小写字母,则会去掉所有小写字母

        //+ (id)uppercaseLetterCharacterSet; //去掉头尾的大写字母
        NSLog(@"str3-->%@", [str3 stringByTrimmingCharactersInSet:[NSCharacterSet uppercaseLetterCharacterSet]]); //-->hello, Wol

        //+ (id)characterSetWithCharactersInString:(NSString *)aString; // 去掉头尾的指定字符串
        //区分大小写
        NSLog(@"-->%@", [str3 stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:str4]]); //-->hello, Wol

--3-- NSMutableString

3.1 NSMutableString基本概念

NSMutableString 类 继承自NSString类,那么NSString中的方法在NSMutableString中基本都可以使用,NSMutableString好比一个字符串链表,它可以任意的动态在字符串中添加字符串、删除字符串、指定位置插入字符串,使用它来操作字符串会更加灵活。

NSMutableString和NSString的区别

NSString是不可变的, 里面的字符串内容是不能进行修改的

NSMutableString是可变的, 里面的文字内容可以更改

3.2 字符串中的可变和不可变

不可变:指的是字符串在内存中占用的存储空间固定,并且存储的内容不能发生变化

可变:指的是字符串在内存中占用的存储空间可以不固定,并且存储的内容可以被修改

3.3 NSMutableString常用方法

通过调用string方法, 创建一个空的NSMutableString

- (void)appendString:(NSString *)aString; 拼接aString到最后面

- (void)appendFormat:(NSString *)format, ...; 拼接一段格式化字符串到最后面

- (void)deleteCharactersInRange:(NSRange)range; 删除range范围内的字符串。一般可以配合rangeOfString删除。

- (void)insertString:(NSString *)aString atIndex:(NSUInteger)loc; 在loc位置中插入aString

- (void)replaceCharactersInRange:(NSRange)range withString:(NSString *)aString; 使用aString替换range范围内的字符串,一般不是以string开头的一般都不会产生一个新的字符串。

replaceOccurrencesOfString: 在Range内替换指定的字符串。

    @autoreleasepool {

        NSMutableString *str = [NSMutableString string]; //可变字符串

        //*************拼接字符串
        [str appendString:@"http://www.google.com"]; //追加
        NSLog(@"str = %@", str); //http://www.google.com
        [str appendFormat:@"%02d", 3]; //格式化拼接
        NSLog(@"str = %@", str); //http://www.google.com03

        //**********删除字符串
        //指定Range
        NSRange range = {3, 4};
        [str deleteCharactersInRange:range]; //Range内删除字符串
        NSLog(@"str = %@", str); //httwww.google.com03

        //一般配合rangeOfString使用
        range = [str rangeOfString:@"google"]; //获取Range
        [str deleteCharactersInRange:range];
        NSLog(@"str = %@", str); //httwww..com03

        //*********替换字符串
        NSLog(@"ragne = %@", NSStringFromRange(range)); //查看一个range

        //replaceCharactersInRange 使用aString替换range范围内的字符串
        [str replaceCharactersInRange:range withString:@"xxxx"];
        NSLog(@"str = %@", str); //httwww.xxxx

        //insertString 在index处插入字符串
        [str insertString:@"abc" atIndex:3];
        NSLog(@"str = %@", str); //httabcwww.xxxx

        NSLog(@"ragne = %@", NSStringFromRange(range)); //查看一个range

        //重置一个range
        range.location = 0;
        range.length = 6;

        //replaceOccurrencesOfString 在Range内替换指定的字符串
        [str replaceOccurrencesOfString:@"abc" withString:@"3" options:0 range:range];
        NSLog(@"str = %@", str); //htt3www.xxxx
    }

综上,字符串在做一些拼接操作时,要将其设置为可变的字符串类型NSMutableString才可进行相应的操作,因为,说到底,可变字符串之所以可以改变其内容,存储空间可变。

3.4 字符串的使用注意

NSMutableString易犯错误

@”hello”这种方式创建的字符串始终是NSString,不是NSMutalbeString.

所以下面的代码创建的还是NSString,此时使用可变字符串的函数,无法操作字符串。

 @autoreleasepool {

        //运行时错误
        NSMutableString *str = @"hello, world"; //将可变字符串赋值不可变字符串这样是错误的
        [str appendString:@"www"]; //不能进行字符串拼接
        NSLog(@"str = %@", str);

    }

【写在结尾】

『对生活微笑,他就会对你微笑』

时间: 2024-10-12 11:41:28

Foundation框架-NSString和NSMutableString的相关文章

Foundation框架(NSString、NSMutableString)

OC字符串(NSString.NSMutableString) 概述:在Object C中存在两个类用于操作字符串,NSString和NSMutableString;NSString在赋值之后不能修改其内容和长度,而NSMutableString可以动态的修改字符串内容和长度. 一.NSString 1.NSString的多种定义方式 1)使用@符号快速创建一个字符串 NSString *str1 = @“jack”; 2)使用对象初始化方法 initWithString  NSString *

Foundation 框架 NSString常用总结

iOS开发过程中,从始至终都会和NSString打交道,在此总结一下NSString的常用的方法,在以后的学习过程中用到的方法也会继续添加 NSString类是Foundation框架中得不可变字符串,当NSString创建完成后,字符串的内容不可更改,与之对应的是NSMutableString类 一.NSString对象的创建 1.使用类方法(stringWithFormat:)进行字符串创建,此方法可以动态的构建字符串,并且能够给字符串传递参数(推荐) 1 NSString* str = [

Foundation框架--NSString类字符串常用操作

比较内容BOOL isEqual=[string1 isEqualToString:String2]; 比较指针地址(string1==string2) 比较字符串大小 升降序 NSComparisonResult result =[string10 caseInsensitiveCompare:string11]; 求字符串长度 NSlog(@"%d",[string11 length]): 字符串转换 NSLog(@"upper:%@",[string11 up

黑马程序员——Foundation之NSString和NSMutableString

在OC中NSString是一个非常重要的字符串类;和C语言的字符串不用的是,C语言的字符串是用双引号括住如“jack”:而OC中的字符串则要以@开关如:@“jack”. NSString是一个不可变的字符串,创建好后里面的内容是不能更改的.不过它还有一个子类NSMutableString,这个类中的字符串是可以修改的如增添或删除. 一.NSString字符串的创建方式: 1.NSString*[email protected]"jack"; 2.NSString*s2=[[NSStri

Objective-C:Foundation框架

Foundation框架 NSString.NSMutableString.NSNumber(基本数据类型包装类).NSValue(特殊类型包装类:指针.数组.结构体).NSArray.NSMutableArray.NSDectionary.NSSet等等. 一.不可变字符串NSString类.可变字符串NSMutableString类(是不可变字符串的子类)1.字符串对象的创建 <1>常量字符串的对象 :最基本的个格式  NSString *str = @“dshsd”; <2>

黑马程序员--Foundation框架之--NSString类以及它的子类NSMutableString类

继续看一下Foundation框架中的常用对象:NSString和NSMutableString 在OC中NSString对象是不可变的,和Java中的String一样的,而NSMutableString是可变的,和Java中的StringBuilder一样. 一.NSString对象 在OC中,NSString对象是非常重要的一个对象,也是最基础的一个对象,是用来处理字符串的常用类. 下面来看一下NSString的一些方法的使用: 1.创建的方法 // 字符串的创建方式 NSString *s

黑马程序员——OC常用类NSString/NSMutableString《Foundation框架中类》

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- NSString/NSMutableString:OC字符串处理核心类         NSString/NSMutableString是Foundation框架中的类,是Objective-C 中字符串处理的核心类.这两个类最大的区别: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框架中的NSString对象和NSMutableString对象

在之前的一篇文章中我们说到了Foundation框架中的NSObject对象,那么今天在在来继续看一下Foundation框架中的常用对象:NSString和NSMutableString. 在OC中NSString对象是不可变的,和Java中的String一样的,而NSMutableString是可变的,和Java中的StringBuilder一样. 一.NSString对象 在OC中,NSString对象是非常重要的一个对象,也是最基础的一个对象,是用来处理字符串的常用类,和Java中的St