美文网首页面试内功修炼iOS收藏
【阅读笔记】OC类库-NSString及NSMutableStr

【阅读笔记】OC类库-NSString及NSMutableStr

作者: 亲爱的大倩倩 | 来源:发表于2016-07-18 15:03 被阅读648次

    NSString头文件

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

    NSString的C底层实现

    AE66D63B-282B-46F7-A614-42FE18D4CFA4.png 6556218F-06C9-4A51-B11D-DC060D124A3C.png

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

    深拷贝和浅拷贝

    先做个小测试

    2CD0549E-7ABE-46B3-8773-1521F357C552.png A471ACEC-2ECC-43FD-9DB4-6CB1A640F2C5.png

    可以很明显的看出来,我们进行的copy操作为浅拷贝,两个指针(str1和str2)指向的是同一块内存地址,
    我们进行的mutableCopy操作为深拷贝,指向的是两块存储相同内容的内存地址.原因是mutableCopy操作是将其拷贝到堆上.引用计数加1.

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

    9C1E04F4-35DF-457D-B4E5-192AA88C00D4.png DB81BF18-898D-4B79-A29B-44D651A37A44.png

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

    再来测试NSMutableString

    E9404A83-F4CC-49DB-AE4B-98CC4CAB3DF6.png 7A7316C4-7C06-4F1A-978B-CD7025BC05D7.png

    从上图我们可以看到
    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;
    

    相关文章

      网友评论

        本文标题:【阅读笔记】OC类库-NSString及NSMutableStr

        本文链接:https://www.haomeiwen.com/subject/cqrpjttx.html