一、NSString是1个类,定义在Foundation框架中,NSString对象的作用:用来存储字符串数据的。
既然是1个类,那么标准的创建NSSting对象的方式有如下几种:
NSString *str1 = [NSString new]; NSString *str2 = [[NSString alloc] init]; NSString *str3 = [NSString string];
以这样的方式创建的字符串对象中存储的字符串数据是@“” 是一个空字符串,注意不是“ ”(空格)。
由于NSString 是OC中常用的对象,所以为了快速的创建NSString对象,可以使用@符号
NSString * name = @"jack";
@"jack"这是1种创建字符串对象的简写的方式,实际上是创建了1个字符串对象,将jack存储进去,name中实际存储的是这个对象的地址。
使用%p打印指针变量的值,使用%@打印指针指向的对象,调用对象的description方法。(注意这个方法是从NSObject类中继承的,在NSString子类重写了的)。
二、谈谈NSString的恒定性
1.当我们创建字符串对象的时候,如果使用@符合来创建的,那么这个字符串对象是存储在常量区(或叫全局区)的。
如果调用方法来创建字符串对象,那么对象是存储在堆区的。
NSString *str1 = @"jack"; //这个字符串对象存储在常量区的 NSString *str2 = [NSString new]; //这个字符串对象是存储在堆区的. NSLog(@"str1 = %p",str1); NSLog(@"str2 = %p",str2);
结构你会发现这两个地址相差很大很大,足以证明不在同一个区的。
2.存储在内存中的字符,无论是在堆区还是在常量区都是不可以改变的,这个就是NSString的恒定性,也就是不可变性。
字符串对象一旦创建,这个字符串对象中存储的字符串数据就不能改变,永远只能存储这个。
我们为NSString指针重新赋值1个字符串的时候,不是修改原来的字符串,而是重新创建了1个字符对象,将这个字符串的地址赋值给指针。不可更改性,也就是针对堆区和常量区的对象说的。
NSString * name = @"jack"; name = @"rose";//在常量区重新开辟了一个空间存储rose对象,并把rose对象的地址赋值给name指针,而jack对象仍然存在内存中,未被他人修改
3.当系统准备在内存中创建1个字符串对象的时候。比如:准备为常量区创建字符对象的时候,先检查常量区有没有内容相同的字符串对象,如果有,就让指针直接指向(所以就存在多个指针指向同一个对象的说法了),如果没有才会创建。
那么堆区呢?同样的道理,如果字符串创建在堆区,是不会去常量区检查的,只会在堆区查找有没有相同的内容的字符串,如果有就直接指向,如果没有才会重新创建。
4.常量区的数据是不会被回收的,所以创建在常量区的字符串是不会被回收的,直到程序结束。那为什么不允许被回收呢,原因就是为了提高效率。你看,当字符串第二次使用的时候,就不要重新创建字符串了,直接使用。
三、NSSting类的常用方法。
1.得到字符串的长度。
@property (readonly) NSUInteger length;
2.得到指定下标的字符。
- (unichar)characterAtIndex:(NSUInteger)index; 返回值是unichar 打印unichar使用%C
3.拼接变量的方式组成1个新的字符串。是一个类方法
+ (instancetype)stringWithFormat:(NSString *)format, ...
实例: NSString *str = [NSString stringWithFormat:@"大家好,我叫%@,我今年%d岁",name,age];
4.将C语言的字符串转换为OC语言的字符串
将C语言的字符串转换为OC字符串对象. + (nullable instancetype)stringWithUTF8String:(const char *)nullTerminatedCString; nullable: 代表返回的对象有可能是nil
char *name = "杰克"; NSString *str = [NSString stringWithUTF8String:name]; NSLog(@"str = %@",str);
5.判断两个字符串的内容是否相同。如果要判断两个字符串的内容是否相同,不要使用==来判断而是使用对象方法,这个方法NSString类已经提供了。注意从第一个字符开始比ASCII码。
- (NSComparisonResult)compare:(NSString *)string; 返回的是1个枚举值. NSOrderedAscending : 当前字符串比传入的字符串小. NSOrderedSame: 一样 NSOrderedDescending 当前字符串比传入的字符串大
NSComparisonResult res = [str1 compare:str2]; switch (res) { case NSOrderedAscending: NSLog(@"小了"); break; case NSOrderedSame: NSLog(@"一样"); break; case NSOrderedDescending: NSLog(@"大了"); break; }
指定选项的比较. 1). 忽略大小写的比较. NSString *str1 = @"jack"; NSString *str2 = @"JACK"; int len = [str1 compare:str2 options:NSCaseInsensitiveSearch]; 2). 完全匹配的比较. NSString *str1 = @"jack"; NSString *str2 = @"JACK"; int len = [str1 compare:str2 options: NSLiteralSearch]; 3). 比较字符串中的数字的大小. NSString *str1 = @"img100021.jpg"; NSString *str2 = @"img100012.jpg"; int len = [str1 compare:str2 options: NSNumericSearch]; 比较的是字符串中数组的大小. 使用前提: 两个字符串的格式要相同.一般情况下用来比较两个路径
6.只判断两个字符串是否相同,返回值是BOOL类型的,只是看内容是否一模一样,相同就是YES,否则NO
- (BOOL)isEqualToString:(NSString *)aString;
NSString *str1 = @"jack"; NSString *str2 = @"jack"; BOOL res = [str1 isEqualToString:str2]; NSLog(@"res = %d",res);
7.将OC字符串转换为C字符串。
@property (nullable, readonly) __strong const char *UTF8String
NSString *str = @"jack"; const char * ch = [str UTF8String]; printf("%s\n", ch);
8.大小写转换
// 所有字符转换成大写 @property (readonly, copy) NSString *uppercaseString; // 所有字符转换成小写 @property (readonly, copy) NSString *lowercaseString; // 每个单词首字母大写,其余字母小写。 @property (readonly, copy) NSString *capitalizedString;
9.将字符串写到指定的文件中去
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error;
实例:
NSError *err = nil; //NSError对象. BOOL res = [str writeToFile:@"/aaUsers/Itcast/Desktop/abc.txt" atomically: NO encoding:NSUTF8StringEncoding error:&err]; if(err == nil) { NSLog(@"ok"); } else { NSLog(@"no ok"); NSLog(@"%@",err.localizedDescription);//可以得到错误信息 }
10.从指定的字符中读取字符串数据
+ (nullable instancetype)stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error;
NSError *err = nil; NSString *str = [NSString stringWithContentsOfFile:@"/Users/Desktop/abc.txt" encoding:NSUTF8StringEncoding error:nil]; //str的值如果是nil 说明失败. //err的值如果不是nil 说明失败. NSLog(@"%@",str);
字符串对象不仅可以从磁盘上读取文件的内容. 还可以从网络上读写数据. 可以读取1个网页的源代码.ftp服务器上的文件也可以读取. 网页地址,ftp文件地址. URL 统一资源路径. 也就是1个网址.ftp文件的地址. 磁盘上的文件的地址. 网址的URL标准写法: http://www.baidu.com ftp文件的URL标准写法: ftp://server.sina.com/aa.avi 磁盘文件路径: file:///Users/Desktop/abc.txt NSString可以从1个URL路径中读写数据. 1). 先将URL路径封装在1个NSURL对象中 NSURL *url1 = [NSURL URLWithString:@"http://www.itheima.com"]; NSURL *url2 = [NSURL URLWithString:@"ftp://server.itheima.com/1.txt"]; NSURL *url3 = [NSURL URLWithString:@"file:///Users/Itcast/Desktop/abc.txt"]; 2). 使用类方法从NSURL对象中读取数据. + (nullable instancetype)stringWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error:(NSError **)error; 3). 往NSURL中写入数据. - (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error;
11.判断字符串是否以指定的字符串开始的
- (BOOL)hasPrefix:(NSString *)str;
12.判断字符是否以自定的字符串结束的
- (BOOL)hasSuffix:(NSString *)str;
13.在字符串中搜索子字符串的范围
@“I love rose”;
@"love"
范围:起始下标是2:长度是:4
- (NSRange)rangeOfString:(NSString *)searchString
返回值代表子字符串在主串中的范围。返回值是一个NSRange 这是一个结构体
typedef struct _NSRange { NSUInteger location; NSUInteger length; } NSRange;
location:代表了这段范围的起始下标
length:代表匹配的长度
如果在主串中没有找到子串,返回的NSRange结构体变量的length值是0,location的值就是NSUInteger的最大值。
如果找到的情况下:
location的值就是第一次匹配的下标
length:代表子串的长度
- (void)appendString:(NSString *)aString; 以拼接的方式追加. - (void)appendFormat:(NSString *)format, ...
说明一下:Range是Foundation框架中定义的一个结构体
这个结构体变量用来表示1个范围的,一般情况下,用来表示子串在主串中的范围
location:起始下标
length:匹配到的长度
@“我爱你北京”
@“爱你”
location:1
length:2
NSRange结构体变量的初始化
a.最简单的初始化,先声明结构体变量,再初始化属性
NSRange range;
range.location = 2;
range.length = 3;
b.NSRange = {2, 3};
c.NSRange range = {.location = 2, .length = 3};
d.Foundation框架提供了1个函数来快速创建1个NSRange结构体变量。
NSRange range = NSMakeRange(2,3);
e.将NSRange结构体变量转换为字符串
NSRange range = NSMakeRange(2,3);
NSString * str = NSStringFromRange(range);
NSLog(@"%@",str);
14.字符串的截取
从指定的下标开始一直截取到最后 - (NSString *)substringFromIndex:(NSUInteger)from; 截取前面指定个数的字符串. - (NSString *)substringToIndex:(NSUInteger)to; 截取指定的范围的字符串. - (NSString *)substringWithRange:(NSRange)range;
15.字符串的替换
@"我很爱很爱你"; 将字符串中的 爱 换成 恨 - (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement 注意的是: 各种操作字符串的方法.原来字符串本身不会变.因为字符串的恒定性. 最终的操作结果都是以返回值返回来的. 还可以实现删除的效果: 将指定的字符串换成@""
16.删除子串前后空格
NSString *str = @" chiwcniwnciwe c winciwn ciewnciewc fcneivbcnei "; str = [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; 只能删除前后的空格,中间的空格如果要删除就是以替换.
四、NSMutableString
1.是Foundation框架中的1个类,从NSString继承,NSString所拥有的功能,NSMutableString都有。
只是对NSString进行了扩展,存储在NSMutableString对象中的字符串数据具备可变性,存储在其中的字符串数据可以改。
NSMutableString字符串的创建方法:
NSMutableString *str1 = [NSMutableString new]; NSMutableString *str2 = [[NSMutableString alloc] init]; NSMutableString *str3 = [NSMutableString string];
2.注意:NSMutableString *str1 = @“jack”;这样的写法是错误的,因为@“jack”是一个NSString对象,str1是1个类指针。如果通过这个指针调用子类独有的方法的时候,运行就会运行报错。
3.如何往NSMutableString对象中存储字符串数据
将字符串追加存储到NSMutableString对象中
- (void)appendString:(NSString *)aString; 以拼接的方式追加. - (void)appendFormat:(NSString *)format, ...
NSMutableString *str = [NSMutableString string]; [str appendString:@"jack"]; [str appendString:@"jack"]; [str appendString:@"jack"]; int num = 19; [str appendFormat:@"haha%dhaha",num]; NSLog(@"%@",str);
注意:NSMutableString对象追加数据,直接就是改的这个对象的内容,不会创建新的对象
4.使用NSMutableString做大量字符串拼接效率就很高了。为什么?因为NSMutableString对象始终只有一个,每次拼接的时候都是直接修改这个对象,并没有创建新的对象。
5.什么时候使用?
NSString:不拼接的时候,同一个字符串对象,如果后面要使用,就不会再创建了,但是大量拼接效率低。
NSMutableString:只有alloc new 都是1个新对象,优点:大量拼接的时候效率高。拼接次数超过7次就认为是大量拼接。
6.将可变字符串对象转换为不可变字符串对象,
调用可变字符串对象的copy(后面详讲)方法,就返回1个NSString对象。
相关推荐
标题中的"Foundation Framework Reference"是指苹果iOS和macOS开发中的Foundation框架的官方参考文档,它是Apple的开发平台上的基础框架之一,提供了许多核心的面向对象编程功能和服务。"iphone Foundation框架参考...
### IOS开发系列—Objective-C之Foundation框架 #### Foundation概述 在深入探讨Objective-C中的Foundation框架之前,我们需要了解几个基本概念。首先,Cocoa并非一种编程语言或开发工具,而是用于构建MacOS X和...
Foundation框架是Objective-C(简称OC)的核心库之一,它为OC提供了一系列基础的类、协议和工具,是构建OC应用的基础。在Foundation框架中,包含了诸如对象模型、集合类、线程管理、文件系统操作、网络通信等众多...
- 在Foundation框架中,`NSString`类提供了创建字符串的方法。需要注意的是,`NSString`对象一旦创建后就不能修改,如果需要一个可变的字符串,则应该使用`NSMutableString`类。 - 创建方法示例: - 创建一个字符...
### Objective-C中的Foundation框架概述 #### 一、Foundation框架简介 Foundation框架是Objective-C编程语言中一个核心且基础的部分,它提供了处理基本数据类型、内存管理、网络连接、图形图像等众多功能的基础...
在Objective-C编程中,`NSString` 和 `NSMutableString` 是两个非常重要的字符串类,它们是Apple的Foundation框架的一部分,用于处理文本数据。本教程将深入探讨这两个类的使用方法、特性以及它们之间的区别。 首先...
在iOS应用中,Unicode主要通过Foundation框架中的NSString、NSMutableString类来实现。这些类能够处理UTF-16编码的Unicode字符串,UTF-16是Unicode的一个常见编码形式,它用两个或四个字节来表示一个字符。 1. **...
**Foundation框架详解** Foundation框架是iOS开发中的基石,它是Apple为macOS、iOS、watchOS和tvOS等操作系统提供的一套基础工具集。这个框架包含了众多用于构建应用程序的基础类和对象,是所有Objective-C和Swift...
在OC中,我们可以利用Foundation框架中的NSString和NSMutableString类来完成这个任务。 首先,我们需要一个方法来接收包含特殊字符的电话号码字符串。这个方法可以是一个实例方法或类别方法,例如: ```objc - ...
3. **Foundation框架中的Unicode支持**:NSString和NSMutableString提供了丰富的API用于处理Unicode字符串,如查找、替换、分割等操作。同时,NSAttributedString允许对字符串的特定部分设置不同的属性,如字体、...
- **字符串处理**:NSString、NSMutableString 提供了丰富的字符串操作,支持 Unicode 和国际化。 - **日期与时间**:NSDate、NSTimeZone、NSCalendar 等类处理日期和时间相关的计算和转换。 - **文件系统操作**...
例如,处理字符串(NSString和NSMutableString)、数组(NSArray和NSMutableArray)、字典(NSDictionary和NSMutableDictionary)等。使用框架中提供的方法,可以执行追加、删除、修改、插入、查询、拆分、遍历等...
在iOS开发中,我们通常使用Foundation框架中的NSString和NSMutableString类来处理字符串。这两个类提供了丰富的字符串操作方法,包括查找、替换、格式化等。然而,当涉及到中文字符时,我们需要关注Unicode编码,...
描述:本讲座深入探讨了Objective-C编程语言的关键概念,包括方法(类和实例)、实例变量、属性、动态绑定、内省、nil与BOOL,以及Foundation框架中的核心类如NSObject、NSString、NSMutableString、NSNumber、...
在OC中,NSString类是处理字符串的主要类,它是Foundation框架的一部分。创建一个NSString对象通常有以下几种方式: 1. 直接初始化字符串: ```objc NSString *str = @"Hello, World!"; ``` 2. 使用`init`方法和`...
在iOS和Mac开发中,Objective-C是主要的编程语言之一,尤其在Apple的Foundation框架中起着核心作用。"WS-OC-Foundation: OC基础框架"这个项目显然旨在提供一个个人封装的基础框架,帮助开发者更好地理解和使用...
- 字符串处理:熟悉NSString、NSMutableString的使用,以及正则表达式操作。 - 数组与集合:深入学习NSArray、NSMutableArray、NSSet、NSMutableDictionary等容器类的使用。 - 字典:掌握NSDictionary、...
1. **数据处理**:在应用程序中存储用户设置、缓存数据时,可以利用Foundation框架提供的`NSData`、`NSCoding`等功能实现高效的数据存储与加载。 2. **文件管理**:通过`NSFileManager`类可以轻松地创建、删除、...
在iOS中,我们可以利用Apple的Foundation框架中的`NSLinguisticTagger`类来实现这个转换。`NSLinguisticTagger`是用于处理文本的语言学信息的工具,包括词性、命名实体、以及我们所需要的拼音等。 接下来,我们将...