iOS基础-NSString及NSMutableString剖析

一、NSString头文件

NSString : NSObject
实现协议:
NSCopying/NSMutableCopying/NSSecureCoding
类别:
//扩展类别
NSString (NSStringExtensionMethods)
//此API是用来检测给定原始数据的字符串编码
NSString (NSStringEncodingDetection)
NSMutableString : NSString
类别:
//可以实现子类的原始replaceCharactersInRange:范围:方法
NSMutableString (NSMutableStringExtensionMethods)

二、NSString的C底层实现

可以看到,两种声明出来的isa是不同的.
第一种isa是__NSCFConstantString,内存地址一样.
第三种和其他objc对象类似的,在堆上分配内存.

三、深拷贝和浅拷贝

先做个小测试

 

可以很明显的看出来,我们进行的copy操作为浅拷贝,两个指针(str1和str2)指向的是同一块内存地址,

我们进行的mutableCopy操作为深拷贝,指向的是两块存储相同内容的内存地址.原因是mutableCopy操作是将其拷贝到堆上.引用计数加1.

下面我们分别测试NSString和NSMutableString
先看NSString

@"123"存储在文字常量区,从上图我们可以很清楚的看到
指针str1和指针str2指向同一内存地址
当str1改变内容后,创建了新的对象,则str1指向另一块内存地址
将str1置为nil,完全不影响str2
所以,NSString为浅拷贝

再来测试NSMutableString

从上图我们可以看到
mutableStr1和mutableStr2虽然内容相同,但指向的是不同的内存地址
改变内容后,仍然是指向自己的内存地址
所以, NSMutableString为深拷贝

总结
浅拷贝:指针拷贝,指针与原指针地址相同,没有创建新的对象。
深拷贝:内容拷贝,创建了新的对象,指针地址与原对象的指针地址不同。
1- 对一个NSString字符串进行copy不会产生新对象(浅拷贝)
2- 对一个NSMutableString字符串进行copy会产生新对象(深拷贝)
3- copy产生的新对象为NSString类型
4- mutableCopy产生的新对象为NSMutableString类型

四、接下来整理一下NSString和NSMutableString的常用方法

NSString常用

获取字符串索引计数(可识别数字/字母/符号/空格,不可识别中文,显示是乱码)
- (unichar)characterAtIndex:(NSUInteger)index;
这个不知道是什么
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder

NSString (NSStringExtensionMethods)常用

设置字符串内容(全部大写,全部小写,首字母大写)

@property (readonly, copy) NSString *uppercaseString;
@property (readonly, copy) NSString *lowercaseString;
@property (readonly, copy) NSString *capitalizedString;

字符串截取

以指定位置开始(包含指定位置的字符),包括之后的全部字符
- (NSString *)substringFromIndex:(NSUInteger)from;
从字符串的开头一直截取到指定位置,但不包括该位置的字符
- (NSString *)substringToIndex:(NSUInteger)to;
按照所给出的位置,长度,从字符串截取子串
- (NSString *)substringWithRange:(NSRange)range;

字符串比较

compare方法(NSComparisonResult是定义的一个枚举,完全一致为0,其余为其他(有1和-1))
字符串比较(必须完全一样,大小写不一致,有空格则均返回1)
- (NSComparisonResult)compare:(NSString *)string;
比较字符串是否完全相等
- (BOOL)isEqualToString:(NSString *)aString;
不考虑大小写比较字符串,相同为0,不相同为其他
- (NSComparisonResult)caseInsensitiveCompare:(NSString *)string;
检查字符串是否以另一字符串开头(true为1,false为0)
- (BOOL)hasPrefix:(NSString *)str;
检查字符串是否以另一字符串结尾(true为1,false为0)
- (BOOL)hasSuffix:(NSString *)str;

字符串查找(如果range.length长度大于0,证明有要查找的子串,否则证明没有)

查找字符串某处是否包含其他字符串
- (NSRange)rangeOfString:(NSString *)searchString;
根据参数options的不同,按照不同的规则查找
- (NSRange)rangeOfString:(NSString *)searchString options:(NSStringCompareOptions)mask;

字符串合并

字符串与字符串的合并
- (NSString *)stringByAppendingString:(NSString *)aString;
字符串与字符串或其它类型数据合并
- (NSString *)stringByAppendingFormat:(NSString *)format;
字符串格式化合并
(instancetype)stringWithFormat:(NSString *)format;

字符串替换

将字符串中的**全部替换成**
- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement
将某一位置的或者搜索出来的字符串替换成一个新的字符串
- (NSString *)stringByReplacingCharactersInRange:(NSRange)range withString:(NSString *)replacement;

字符串创建及赋值

创建字符串并赋值
(instancetype)initWithString:(NSString *)aString;
经典的字符串赋值
(instancetype)string;
字符串赋值,参数只可写一个字符串
(instancetype)stringWithString:(NSString *)string;

字符串写入文件

- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error;

从文件中读取字符串,并经过转码(保证读出的中文不是乱码)

+ (nullable instancetype)stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error;

NSMutableString常用

字符串替换

将字符串中制定位置,长度的字符串替换成其他字符串
- (void)replaceCharactersInRange:(NSRange)range withString:(NSString *)aString;

NSMutableString (NSMutableStringExtensionMethods)常用

设置字符串内容
- (void)setString:(NSString *)aString;
在指定位置插入字符串
- (void)insertString:(NSString *)aString atIndex:(NSUInteger)loc;
- (void)appendString:(NSString *)aString;
- (void)appendFormat:(NSString *)format;
时间: 2024-11-07 17:42:17

iOS基础-NSString及NSMutableString剖析的相关文章

iOS基础 01 构建HelloWorld,剖析并真机测试

iOS基础 01 构建HelloWorld,剖析并真机测试 前言: 从控制台输出HelloWorld是我们学习各种语言的第一步,也是我们人生中非常重要的一步. 多年之后,我希望我们仍能怀有学习上进的心情,继续以HelloWorld去认识这世界上更多的东西. 本篇以HelloWorld作为切入点,向大家系统介绍什么事iOS应用以及如何使用Xcode创建iOS应用. 目录: 1. 创建HelloWorld工程 1.1. 设计界面 1.2. 真机测试 2. Xcode中的iOS工程模板 2.1. Ap

IOS基础面试题

最近离职了,找工作,光会做项目,对基础不熟,今天就总结了一点面试题. 废话不多说,上题吧: 1.objective-c中的数字对象都有哪些,简述它们与基本数据类型的区别是什么. 基本类型和C一样,主要是有int.long.double.float.char.void.bool.对于基本数据类型,不需要使用指针,NSNumber是OC的数字对象,需要考虑内存释放问题.数字类型有:NSInteger.CGFloat.数据对象有NSNumber.对象和变量的差别.可以拆装效果.其他的类型有NSStri

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 字符

iOS 基础之—— Properties

一篇关于iOS 编程中 @property 方法中属性的介绍,写的十分简洁明了,原文链接请戳. ===读后分割线==== 在iOS 5之后,有了ARC 的出现,不需要手动进行内存管理,@property 中的属性也有了一些变化. 现在常使用的如下: 属性 功能介绍 getter= 给getter方法一个自定义名称 setter= 给setter方法一个自定义名称 readonly 不生成setter方法 nonatomic 禁止多线程,相较默认的线程保护(atomic)可提高性能 内存管理属性

关于NSString和NSMutableString的相关用法和基本介绍

Objective-C 中核心处理字符串的类是 NSString 与 NSMutableString ,这两个类最大的区别就是NSString 创建赋值以后该字符串的内容与长度不能在动态的更改,除非重新给这个字符串赋值.而NSMutableString 创建赋值以后可以动态在该字符串上更改内容与长度. NSString 常用方法总结 +(id)stringWithContentsOfFile:path encoding:enc err 创建一个新字符串并将其设置为 path 指定文件的内容,使用

IOS中NSString的常见用法

iOS NSString的常用用法 //1.创建常量字符串. NSString *astring = @"This is a String!"; //2.创建空字符串,给予赋值. NSString *astring = [[NSString alloc] init]; astring = @"This is a String!"; //3.在以上方法中,提升速度:initWithString方法 NSString *astring = [[NSString allo

iOS 基础 第二天(0805)

0805 面向对象三大特性 封装.继承和多态 oc的方法都是在运行过程中才会检测的.编译时方法没实现只会出现警告,运行时出错.如果方法实现了但没有声明,运行时对象仍然可以调用方法不会出错.这是OC中弱语法的表现 说白了oc中的弱语法就是因为运行时检测合理性和可用性.编译时不会出错顶多是警告,运行时才警告.这个现象不仅仅体验在方法的声明和实现上,比较好的一个例子是MPMoviePlayerController的截屏通知事件,它需要传入float类型的数组,如果你在编译写了整型不会报错也不会警告,但

Foundation框架(NSString、NSMutableString)

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

iOS基础控件UINavigationController中的传值

iOS基础控件UINavigationController中的传值,代理传值,正向传值,反向传值 #import <UIKit/UIKit.h> //声明一个协议 @protocol SendValue<NSObject> //定义一个方法 - (void)sendBtnTitle:(NSString *)title; @end @interface FirstViewController : UIViewController // 定义代理 @property (nonatomi