`
qianjiangbing
  • 浏览: 92094 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Foundation框架之NSString/NSMutableString

阅读更多

一、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&iphone Foundation框架参考

    标题中的"Foundation Framework Reference"是指苹果iOS和macOS开发中的Foundation框架的官方参考文档,它是Apple的开发平台上的基础框架之一,提供了许多核心的面向对象编程功能和服务。"iphone Foundation框架参考...

    IOS开发系列—Objective-C之Foundation框架 - KenshinCui - 博客园.pdf

    ### IOS开发系列—Objective-C之Foundation框架 #### Foundation概述 在深入探讨Objective-C中的Foundation框架之前,我们需要了解几个基本概念。首先,Cocoa并非一种编程语言或开发工具,而是用于构建MacOS X和...

    Foundation框架

    Foundation框架是Objective-C(简称OC)的核心库之一,它为OC提供了一系列基础的类、协议和工具,是构建OC应用的基础。在Foundation框架中,包含了诸如对象模型、集合类、线程管理、文件系统操作、网络通信等众多...

    【无限互联】iOS开发视频教程课件第四章Foundation框架课件

    - 在Foundation框架中,`NSString`类提供了创建字符串的方法。需要注意的是,`NSString`对象一旦创建后就不能修改,如果需要一个可变的字符串,则应该使用`NSMutableString`类。 - 创建方法示例: - 创建一个字符...

    object c中关于foundation类得ppt

    ### Objective-C中的Foundation框架概述 #### 一、Foundation框架简介 Foundation框架是Objective-C编程语言中一个核心且基础的部分,它提供了处理基本数据类型、内存管理、网络连接、图形图像等众多功能的基础...

    NSStringDemo

    在Objective-C编程中,`NSString` 和 `NSMutableString` 是两个非常重要的字符串类,它们是Apple的Foundation框架的一部分,用于处理文本数据。本教程将深入探讨这两个类的使用方法、特性以及它们之间的区别。 首先...

    IOS应用源码之【应用】Unicode源碼.zip

    在iOS应用中,Unicode主要通过Foundation框架中的NSString、NSMutableString类来实现。这些类能够处理UTF-16编码的Unicode字符串,UTF-16是Unicode的一个常见编码形式,它用两个或四个字节来表示一个字符。 1. **...

    Foundation

    **Foundation框架详解** Foundation框架是iOS开发中的基石,它是Apple为macOS、iOS、watchOS和tvOS等操作系统提供的一套基础工具集。这个框架包含了众多用于构建应用程序的基础类和对象,是所有Objective-C和Swift...

    OC实现的电话号码格式化

    在OC中,我们可以利用Foundation框架中的NSString和NSMutableString类来完成这个任务。 首先,我们需要一个方法来接收包含特殊字符的电话号码字符串。这个方法可以是一个实例方法或类别方法,例如: ```objc - ...

    IOS应用源码之【应用】-Unicode源碼.rar

    3. **Foundation框架中的Unicode支持**:NSString和NSMutableString提供了丰富的API用于处理Unicode字符串,如查找、替换、分割等操作。同时,NSAttributedString允许对字符串的特定部分设置不同的属性,如字体、...

    libFoundation - MacOS X Foundation-开源

    - **字符串处理**:NSString、NSMutableString 提供了丰富的字符串操作,支持 Unicode 和国际化。 - **日期与时间**:NSDate、NSTimeZone、NSCalendar 等类处理日期和时间相关的计算和转换。 - **文件系统操作**...

    objective-c教程

    例如,处理字符串(NSString和NSMutableString)、数组(NSArray和NSMutableArray)、字典(NSDictionary和NSMutableDictionary)等。使用框架中提供的方法,可以执行追加、删除、修改、插入、查询、拆分、遍历等...

    iOS 字符串转中文

    在iOS开发中,我们通常使用Foundation框架中的NSString和NSMutableString类来处理字符串。这两个类提供了丰富的字符串操作方法,包括查找、替换、格式化等。然而,当涉及到中文字符时,我们需要关注Unicode编码,...

    Lecture 3: Objective-C

    描述:本讲座深入探讨了Objective-C编程语言的关键概念,包括方法(类和实例)、实例变量、属性、动态绑定、内省、nil与BOOL,以及Foundation框架中的核心类如NSObject、NSString、NSMutableString、NSNumber、...

    OC-初学者基础-字符串

    在OC中,NSString类是处理字符串的主要类,它是Foundation框架的一部分。创建一个NSString对象通常有以下几种方式: 1. 直接初始化字符串: ```objc NSString *str = @"Hello, World!"; ``` 2. 使用`init`方法和`...

    WS-OC-Foundation:OC基础框架

    在iOS和Mac开发中,Objective-C是主要的编程语言之一,尤其在Apple的Foundation框架中起着核心作用。"WS-OC-Foundation: OC基础框架"这个项目显然旨在提供一个个人封装的基础框架,帮助开发者更好地理解和使用...

    黑马iOS入学面试知识点全总结

    - 字符串处理:熟悉NSString、NSMutableString的使用,以及正则表达式操作。 - 数组与集合:深入学习NSArray、NSMutableArray、NSSet、NSMutableDictionary等容器类的使用。 - 字典:掌握NSDictionary、...

    高清彩版 Foundation Framework Reference

    1. **数据处理**:在应用程序中存储用户设置、缓存数据时,可以利用Foundation框架提供的`NSData`、`NSCoding`等功能实现高效的数据存储与加载。 2. **文件管理**:通过`NSFileManager`类可以轻松地创建、删除、...

    IOS获取汉字的首字母

    在iOS中,我们可以利用Apple的Foundation框架中的`NSLinguisticTagger`类来实现这个转换。`NSLinguisticTagger`是用于处理文本的语言学信息的工具,包括词性、命名实体、以及我们所需要的拼音等。 接下来,我们将...

Global site tag (gtag.js) - Google Analytics