一、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为深拷贝

总结
浅拷贝:指针拷贝,指针与原指针地址相同,没有创建新的对象。
深拷贝:内容拷贝,创建了新的对象,指针地址与原对象的指针地址不同。
- 对一个NSString字符串进行copy不会产生新对象(浅拷贝)
- 对一个NSMutableString字符串进行copy会产生新对象(深拷贝)
- copy产生的新对象为NSString类型
- 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)
- (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;

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

  1. Foundation框架-NSString和NSMutableString

    可变与不可变的字符串 --1-- Foundation框架介绍 1.1 框架介绍 --2-- NSString 2.1 NSString介绍及使用 2.2 NSString创建方式  2.3 从文件中 ...

  2. IOS基础面试题

    最近离职了,找工作,光会做项目,对基础不熟,今天就总结了一点面试题. 废话不多说,上题吧: 1.objective-c中的数字对象都有哪些,简述它们与基本数据类型的区别是什么. 基本类型和C一样,主要 ...

  3. Objective-C学习篇06—NSString与NSMutableString

    NSString OC提供了定义字符串对象的方法,也就是将想要表达的字符串用一对双引号引起来,并在开头加上@.@是OC中的指令符,它告诉编译器@以后的内容为OC中的语法.比如@”Harbingwang ...

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

    Objective-C 中核心处理字符串的类是 NSString 与 NSMutableString ,这两个类最大的区别就是NSString 创建赋值以后该字符串的内容与长度不能在动态的更改,除非重 ...

  5. iOS 基础日记-修饰符

    今晚随便温习了一下iOS 基础关于修饰符这块的东西,下面简单的来描述一下,其中有的也是在网络学习到的: strong与weak是由ARC新引入的对象变量属性 ARC的解释:ARC引入了新的对象的生命周 ...

  6. Objective-C: 字符串NSString与NSMutableString

    字符串算是OC中非常重要和常用的一部分内容,OC中的字符串与我之前在学习C,C++,Java中的字符串有一定的不同,它非常类似于C++中容器的概念,但用法却与之还是有很大的不同,也许是因为OC的语法就 ...

  7. [iOS基础控件 - 5.5] 代理设计模式 (基于”APP列表"练习)

    A.概述      在"[iOS基础控件 - 4.4] APP列表 进一步封装,初见MVC模式”上进一步改进,给“下载”按钮加上效果.功能      1.按钮点击后,显示为“已下载”,并且不 ...

  8. bjective-C 中核心处理字符串的类是 NSString 与 NSMutableString

    Objective-C 中核心处理字符串的类是 NSString 与 NSMutableString ,这两个类最大的区别就是NSString 创建赋值以后该字符串的内容与长度不能在动态的更改,除非重 ...

  9. NSString和NSMutablestring,copy和strong(转载)

    1.http://www.cocoachina.com/ios/20150512/11805.html 2.http://blog.csdn.net/winzlee/article/details/5 ...

随机推荐

  1. Microsoft Visual Studio has encountered a problem

    VS 2010 断点调试的时候,一运行到断点就报这个错误"Visual Studio has encountered a problem and needs to close", ...

  2. cocos2d-x3.2创建新项目失败的一种可能性(cygwin自带的python2.6被抢先执行)

    之前一直使用cocos2d-x2.2写游戏,写了几个游戏后,想尝试下3.x版本的新功能,就下载了cocos2d-x3.2版本. 参照官方文档的说法,cocos2d-x3.x版本需要python2.7环 ...

  3. php-建造者模式(Builder)解析

    其与抽象模式相类似,都可以创建复杂的对象,但是抽象工厂更注重多个系列的产品对象,而Builder模式则着重于一步一步的构建一个复杂的对象,在最后一步才返回产品, 使用建造者模式的好处是: 1.将构造代 ...

  4. Arcmap 安装完后使用出现visual fortran run-time error的解决方法

    今天将ArcGIS安装到自己的XP笔记本上,安装过程一帆风顺,但打开Arcmap使用的时候,出现了visual fortran run-time error. 下面是解决方法: 下载个Dforrt.d ...

  5. 《Unix/Linux网络日志分析与流量监控》获2015年度最受读者喜爱的IT图书奖

    <Unix/Linux网络日志分析与流量监控>获2015年度最受读者喜爱的IT图书奖.刊登在<中华读书报>( 2015年01月28日 19 版) 我的2015年新作刊登在< ...

  6. artTemplate 自动化编译之tmod

    一.背景 前端小白的成长历程,一般都会经历html模板的一些问题,jquery template/artTemplate/yayaTemplate等常见的模板使用,这里就不作介绍了. 先谈谈我们为什么 ...

  7. Thinkphp源码分析系列(五)–系统钩子实现

    Thinkphp的插件机制主要依靠的是Hook.class.php这个类,官方文档中在行为扩展也主要依靠这个类来实现.下面我们来具体看看tp是怎么利用这个类来实现行为扩展的. 首先,行为扩展是什么?有 ...

  8. js一个抽奖的例子

    朋友公司开年会,帮忙写了个抽奖的demo,源码如下,github中有程序: html: <header> lottery demo </header> <div clas ...

  9. equals标准写法

    @Overridepublic boolean equals(Object obj) { //为了提高效率 if(this == obj){ return true; } //为了提供程序的健壮性 / ...

  10. Android四大组件及activity的四大启动模式

    Android四大组件 1. 广播接收者的两种类型: (1)系统广播接收者,就是继承BroadcastReceiver这个类,然后还要在清单文件中注册,注册之后给他一个action.当系统发生了这个a ...