11.NSString与NSMutableString

参考自xx_cc的简书文章


NSString创建与内存存储

NSString的本质是一个类,最标准的创建NSString对象的方式如下:

NSString *str1 = [NSString new];
NSString *str2 = [[NSString alloc] init];
NSString *str3 = [NSString string];

使用这种方式创建的字符串是一个空的字符@""
OC提供了一种更为快速的创建字符串对象的方式:使用前缀@

NSString *str1 = @"rose";

@"rose"本质上是一个NSString对象,这个对象中存储的是字符串"rose"。将这个字符串对象的地址返回赋值给str1指针。

NSString的恒定性

使用@快速创建字符串对象的时候,这个字符串对象是存储在常量区(数据段) 的。
当我们调用NSString的类方法来创建对象的时候.创建的字符串对象是存储在堆区。

NSString *str = @"jack";
NSString *str1 = [NSString new];
NSLog(@"str:%p",str);  // str:0x100001040
NSLog(@"str1:%p",str1);  // str1:0x7fff97f512e8

重新为字符串指针初始化值的时候,会创建一个字符串对象并将这个字符串对象的地址重新赋值给字符串指针变量。

NSString *str1 = @"jack";
NSLog(@"str1:%p",str1);  // str1:0x100001038
str1 = @"rose";
NSLog(@"str1:%p",str1);  // str1:0x100001078

当系统准备要在内存中创建字符串对象的时候,会先检查内存中是否有相同内容的字符串对象,如果有,直接指向该内存区域,如果没有才会重新创建。

NSString *str1 = @"jack";
NSLog(@"str1:%p",str1);  // str1:0x100001038
str1 = nil;
NSString *str2 = @"jack";
NSLog(@"str2:%p",str2);  // str1:0x100001038

注意:存储在常量区的数据不会被回收. 所以存储在常量区的字符串对象也不会被回收.

NSString类的常用方法
  1. 使用拼接的方式创建1个NSString对象
    + (instancetype)stringWithFormat:(NSString *)format, ...
  2. 获取字符串的长度
    @property (readonly) NSUInteger length;
  3. 得到字符串中指定下标的字符,返回值是unichar类型,打印使用%C
    - (unichar)characterAtIndex:(NSUInteger)index;
  4. 判断当前字符串对象和传入的字符串对象的内容是否相同
    - (BOOL)isEqualToString:(NSString *)aString;
    注意:不可以使用==来判断两个OC字符串的内容是否相同, ==运算符的作用: 比较左右两边的数据是否相同,如果两边都是指针变量,那么比较的是指针变量的值也就是地址。
  5. 将C语言的字符串转换为OC字符串对象
    + (instancetype)stringWithUTF8String:(NSString *)string;
  6. 将OC字符串对象转换为C语言的字符串
    @property (nullable, readonly) __strong const char *UTF8String
  7. 将字符串写入到指定的文件中
    - (BOOL)writeToFile:(NSString * )path atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError ** )error;
  8. 将文件中的内容读取到字符串中
    + (nullable instancetype)stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error;
  9. 使用NSURL读写资源,字符串提供了对应的方法去读写NSURL对象中封装的资源路径
//从指定资源路径读取文本内容
 + (nullable instancetype)stringWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error:(NSError **)error;
//将字符串的内容写入到资源路径中
  - (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error;
// 如果要向网页或者ftp写内容要有权限

10.字符串比较
- (NSComparisonResult)compare:(NSString *)string;
11.字符串比较:附加条件的比较
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask;

  1. 判断字符串是否以指定的字符串开头
    - (BOOL)hasPrefix:(NSString *)str;
  2. 判断字符串是否以指定的字符串结尾
    - (BOOL)hasSuffix:(NSString *)str;
    14.在字符串中搜索字符串
    - (NSRange)rangeOfString:(NSString *)searchString;
  3. 从指定的下标出一直截取到最后
    - (NSString *)substringFromIndex:(NSUInteger)from;
  4. 从第0个开始截取指定的个数
    - (NSString *)substringToIndex:(NSUInteger)to;
  5. 截取指定的一段范围
    - (NSString *)substringWithRange:(NSRange)range;
  6. 字符串替换
    - (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement
    19.将转换字符串大小写
    @property (readonly, copy) NSString *uppercaseString; // 转换为大写
    @property (readonly, copy) NSString *lowercaseString; // 换换为小写
NSMutableString的初始化

NSMutableString为可变字符串,无论修改多少次,对象始终只有一个,每次修改字符串的时候不会再重新创建对象。NSMutableString继承自NSString。

NSMutableString *str1 = [[NSMutableString alloc]init];
NSMutableString *str2 = [NSMutableString string];

注意:不能直接初始化一个字符串常量给NSMutableString
例如:NSMutableString *str = @"xx_cc";因为@"xx_cc"是一个父类对象,而str指针是一个子类指针,子类指针不能指向父类对象,当调用str的子类独有方法的时候就会出错。

NSMutableString的常用方法
  1. 追加新的字符串
    - (void)appendString:(NSString *)aString;
    - (void)appendFormat:(NSString *)format, ... ;
  2. NSMutableString转化为NSString,转化后就具备了恒定性
    + (instancetype)stringWithString:(NSString *)string;
NSString与NSMutableString的使用场景

需要多次使用一个固定的字符串的时尽量使用NSString,不会创建多余的重复的对象。而当需要大量拼接字符串的时候,需要使用NSMutablString,保证每次拼接都是操作一个对象,不会重复创建多个对象。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,013评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,205评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,370评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,168评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,153评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,954评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,271评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,916评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,382评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,877评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,989评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,624评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,209评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,199评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,418评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,401评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,700评论 2 345

推荐阅读更多精彩内容