NSString、NSMutableString基础知识

三种类型 NSCFConstantString、NSCFString、NSTaggedPointerString

1、NSCFConstantString字符串常量

NSCFConstantString对象,只要字符串内容不变,就不会分配新的内存地址,无论你是赋值、retain、copy。这种优化在大量使用NSString的情况下可以节省内存,提高性能

    NSString *str1 = @"aaa";
    NSString *str2 = [NSString stringWithString:@"aaa"];// XCode会提示 其实就是 str2 = @"aaa";
    NSString *str3 = [[NSString alloc] initWithString:@"aaa"];// XCode会提示 其实就是 str3 = @"aaa";
    // 三个都是一样,字符串常量NSCFConstantString,同一个地址
2、NSTaggedPointerString

当数字、英文、符号等的ASCII字符组成字符串,长度小于等于9的时候会自动成为NSTaggedPointerString类型(TaggedPointer专门用来存储小的对象)

  
   // NSTaggedPointerString
    NSString *str5 = [NSString stringWithFormat:@"123456789"];
    NSString *str6 = [NSString stringWithFormat:@"123ASD"];

NSTaggedPointerString是假对象,指针的值不再是地址了,而是真正的值。所以,实际上它不再是一个对象了,它只是一个披着对象皮的普通变量而已!所以,它的内存并不存储在堆中,也不需要malloc和free。

    NSString *str1 = [NSString stringWithFormat:@"1"];
    NSString *str2 = [NSString stringWithFormat:@"2"];
    NSString *str3 = [NSString stringWithFormat:@"a"];
    NSString *str4 = [NSString stringWithFormat:@"b"];
    NSLog(@"=====%p",str1);
    NSLog(@"=====%p",str2);
    NSLog(@"=====%p",str3);
    NSLog(@"=====%p",str4);
    
    /*
    输出 = =====0xa000000000000311    ASCII码表31就是1
    输出 = =====0xa000000000000321    32就是2
    输出 = =====0xa000000000000611    61就是a
    输出 = =====0xa000000000000621    62就是b
     */
3、NSCFString

字符串(可能是非 ASCII 字符)长度大于9的非常量字符串,是__NSCFString类型。
NSCFString对象是一种NSString子类,存储在堆上,不属于字符串常量对象。该对象创建之后和其他的Obj对象一样引用计数为1,对其执行retain和release将改变其retainCount。

    NSString *str1 = [NSString stringWithFormat:@"1234567890"];
    NSString *str2 = [[NSString alloc] stringWithFormat:@"123你好"];
    // NSCFString对象是一种NSString子类,存储在堆上,不属于字符串常量对象。该对象创建之后和其他的Obj对象一样引用计数为1,对其执行retain和release将改变其retainCount。

各种属性

//字符串长度
@property (readonly) NSUInteger length;
//选取字符串对应下表的字符
- (unichar)characterAtIndex:(NSUInteger)index;

初始化方法

// 字符串的init初始化方法
- (instancetype)init NS_DESIGNATED_INITIALIZER;
// NSCoding协议-实例化序列化
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER;
// 指定缓冲区,编码和字节长度初始化NSString对象
- (instancetype)initWithCharactersNoCopy:(unichar *)characters length:(NSUInteger)length freeWhenDone:(BOOL)freeBuffer;
// 指定unichar字符,字节长度初始化NSString对象
- (instancetype)initWithCharacters:(constunichar *)characters length:(NSUInteger)length;
// 转化为NSString对象
- (instancetype)initWithUTF8String:(constchar *)nullTerminatedCString;
// 指定字符串初始化为NSString对象
- (instancetype)initWithString:(NSString *)aString;
// 格式化多个字符串初始化NSString对象
- (instancetype)initWithFormat:(NSString *)format, ...NS_FORMAT_FUNCTION(1,2);
// 格式化字符串初始化NSString对象
- (instancetype)initWithFormat:(NSString *)format arguments:(va_list)argListNS_FORMAT_FUNCTION(1,0);
// 本地化格式化多个字符串初始化NSString对象
- (instancetype)initWithFormat:(NSString *)format locale:(id)locale, ...NS_FORMAT_FUNCTION(1,3);
// 本地化格式化字符串初始化NSString对象
- (instancetype)initWithFormat:(NSString *)format locale:(id)locale arguments:(va_list)argListNS_FORMAT_FUNCTION(1,0);
// 指定编码转化NSData数据
- (instancetype)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding;
// 指定编码和字节数初始化NSString对象
- (instancetype)initWithBytes:(constvoid *)bytes length:(NSUInteger)len encoding:(NSStringEncoding)encoding;
// 指定缓冲区,编码和字节数初始化NSString对象
- (instancetype)initWithBytesNoCopy:(void *)bytes length:(NSUInteger)len encoding:(NSStringEncoding)encoding freeWhenDone:(BOOL)freeBuffer;
// 初始化空字符串
+ (instancetype)string;
// 初始化NSString字符串
+ (instancetype)stringWithString:(NSString *)string;
// 返回指定长度unichar的C字符串
+ (instancetype)stringWithCharacters:(constunichar *)characters length:(NSUInteger)length;
// 转化C字符串为UTF8串
+ (instancetype)stringWithUTF8String:(constchar *)nullTerminatedCString;
// 初始化NSString对象昂,这种创建方式会自动释放内存,很常用的一种方式
+ (instancetype)stringWithFormat:(NSString *)format, ...NS_FORMAT_FUNCTION(1,2);
// 初始化NSString自动释放内存,本地化
+ (instancetype)localizedStringWithFormat:(NSString *)format, ...NS_FORMAT_FUNCTION(1,2);
// 初始化C字符串并且指定编码,在这里需要手动释放内存(init)
- (instancetype)initWithCString:(constchar *)nullTerminatedCString encoding:(NSStringEncoding)encoding;
// 初始化C字符串并且指定编码,在这里需要自动释放内存
+ (instancetype)stringWithCString:(constchar *)cString encoding:(NSStringEncoding)enc;
// 读取URL地址数据转化为字符串并且指定编码,在这里init创建需要手动释放内存,已经知道编码
- (instancetype)initWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error:(NSError **)error;
// 读取FILE地址数据转化为字符串并且指定编码,同样需要手动释放内存,已经知道编码
- (instancetype)initWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error;
// 读取URL地址数据转化为字符串并且指定编码,,这里会自动释放内存,已经知道编码
+ (instancetype)stringWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error:(NSError **)error;
// 读取FILE地址数据转化为字符串并且指定编码,这里也会自定释放内存,已经知道编码
+ (instancetype)stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error;
// 读取URL地址数据转化为字符串并且指定编码,在这里init创建需要手动释放内存,不知道编码
- (instancetype)initWithContentsOfURL:(NSURL *)url usedEncoding:(NSStringEncoding *)enc error:(NSError **)error;
// 读取FILE地址数据转化为字符串并且指定编码,同样需要手动释放内存,不知道编码
- (instancetype)initWithContentsOfFile:(NSString *)path usedEncoding:(NSStringEncoding *)enc error:(NSError **)error;
// 取URL地址数据转化为字符串并且指定编码,,这里会自动释放内存,不知道编码
+ (instancetype)stringWithContentsOfURL:(NSURL *)url usedEncoding:(NSStringEncoding *)enc error:(NSError **)error;
// 读取FILE地址数据转化为字符串并且指定编码,这里也会自定释放内存,不知道编码
+ (instancetype)stringWithContentsOfFile:(NSString *)path usedEncoding:(NSStringEncoding *)enc error:(NSError **)error;

字符串截取

/* 防止Emoji表情截取问题,应该这样子使用:
 [str substringFromIndex:[str rangeOfComposedCharacterSequenceAtIndex:index].location]
 [str substringToIndex:NSMaxRange([str rangeOfComposedCharacterSequenceAtIndex:index])]
 [str substringWithRange:[str rangeOfComposedCharacterSequencesForRange:range]
 */
// 截取指定位置Index之后字符串
- (NSString *)substringFromIndex:(NSUInteger)from;
// 从索引0第一个字符串开始,截取指定长度的字符串
- (NSString *)substringToIndex:(NSUInteger)to;
// 截取字符串的指定段,返回值为NSString
- (NSString *)substringWithRange:(NSRange)range;                // Use with rangeOfComposedCharacterSequencesForRange: to avoid breaking up character sequences

// 截取字符串的指定段
- (void)getCharacters:(unichar *)buffer range:(NSRange)range;

字符串对比

//字符串进行比较
typedef NS_OPTIONS(NSUInteger, NSStringCompareOptions) {
    NSCaseInsensitiveSearch =1,//两个字符串的比较不区分大小写
    NSLiteralSearch = 2,//两个字符串的比较区分大小写
    NSBackwardsSearch =4,//从字符串末尾开发查询搜索
    NSAnchoredSearch =8,//搜索有限制范围的字符串
    NSNumericSearch = 64,//根据字符串里的数字来计算顺序
    NSDiacriticInsensitiveSearchNS_ENUM_AVAILABLE(10_5,2_0) =128,
    NSWidthInsensitiveSearch NS_ENUM_AVAILABLE(10_5,2_0) =256,//可以忽略字符串的宽度(长度)比较结果
    NSForcedOrderingSearchNS_ENUM_AVAILABLE(10_5,2_0) =512,//忽略不区分大小写比较的选项
    NSRegularExpressionSearchNS_ENUM_AVAILABLE(10_7,3_2) =1024 //
};

/**
 比较字符串
 @param string self与string比较
 @param mask NSStringCompareOptions条件
 @param rangeOfReceiverToCompare 指定段进行比较(只是对self)
 @param locale 某些条件还有本地化语言环境
 @return NSComparisonResult  NSOrderedAscending大   NSOrderedSame相同  NSOrderedDescending小
 */
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask range:(NSRange)rangeOfReceiverToCompare locale:(nullable id)locale;
- (NSComparisonResult)compare:(NSString *)string;
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask;
- (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask range:(NSRange)rangeOfReceiverToCompare;

// 不区分大小写比较字符串
- (NSComparisonResult)caseInsensitiveCompare:(NSString *)string;
// 本地化比较字符串
- (NSComparisonResult)localizedCompare:(NSString *)string;
//不区分大小写以及本地化比较字符串
- (NSComparisonResult)localizedCaseInsensitiveCompare:(NSString *)string;

// 本地化标准字符串比较--它排序的方式和 Finder 一样。它对应的选项是 NSCaseInsensitiveSearch、NSNumericSearch、NSWidthInsensitiveSearch 以及 NSForcedOrderingSearch。如果我们要在 UI 上显示一个文件列表,用它就最合适不过了
/*
//OC之按中文排序(localizedStandardCompare)
    NSArray *arrs=@[@"小雨",@"安安",@"小风",@"荣荣",@"张涛",@"李文荣"];
    NSArray *sortarr=[arrs sortedArrayUsingComparator:^NSComparisonResult(id obj1,id obj2){
            return [obj1 localizedStandardCompare:obj2];//中文按照拼音的首字母排序
    }];
 */
- (NSComparisonResult)localizedStandardCompare:(NSString *)string NS_AVAILABLE(10_6, 4_0);

// 判断两个字符串是否内容一致
- (BOOL)isEqualToString:(NSString *)aString;

字符串搜索查找

// 是否包含前缀(以str开头)
- (BOOL)hasPrefix:(NSString *)str;
// 是否包含后缀(以str结尾)
- (BOOL)hasSuffix:(NSString *)str;

// 获取公共前缀   加入self=@“ABC1234” str=@“ABC789”,返回就是ABC
- (NSString *)commonPrefixWithString:(NSString *)str options:(NSStringCompareOptions)mask;

// 是否包含字符串
- (BOOL)containsString:(NSString *)str NS_AVAILABLE(10_10, 8_0);
// 本地化是否包含字符串(不区分大小写)
- (BOOL)localizedCaseInsensitiveContainsString:(NSString *)str NS_AVAILABLE(10_10, 8_0);

// 本地化是否包含字符串(标准)
- (BOOL)localizedStandardContainsString:(NSString *)str NS_AVAILABLE(10_11, 9_0);
// 本地化搜索字符串范围(标准)
- (NSRange)localizedStandardRangeOfString:(NSString *)str NS_AVAILABLE(10_11, 9_0);

//搜索(指定字符串)
- (NSRange)rangeOfString:(NSString *)searchString;
//搜索(指定字符串,条件)
- (NSRange)rangeOfString:(NSString *)searchString options:(NSStringCompareOptions)mask;
//搜索(指定字符串,条件,范围)
- (NSRange)rangeOfString:(NSString *)searchString options:(NSStringCompareOptions)mask range:(NSRange)searchRange;
//搜索(指定字符串,条件,范围,本地化)
- (NSRange)rangeOfString:(NSString *)searchString options:(NSStringCompareOptions)mask range:(NSRange)searchRange locale:(nullable NSLocale *)locale;

// 搜索(指定字符集合)
- (NSRange)rangeOfCharacterFromSet:(NSCharacterSet *)searchSet;
// 搜索(指定字符集合,条件)
- (NSRange)rangeOfCharacterFromSet:(NSCharacterSet *)searchSet options:(NSStringCompareOptions)mask;
// 搜索(指定字符集合,条件,范围)
- (NSRange)rangeOfCharacterFromSet:(NSCharacterSet *)searchSet options:(NSStringCompareOptions)mask range:(NSRange)searchRange;

// 用字符串的字符编码指定索引查找位置
- (NSRange)rangeOfComposedCharacterSequenceAtIndex:(NSUInteger)index;
// 用字符串的字符编码指定区域段查找位置
- (NSRange)rangeOfComposedCharacterSequencesForRange:(NSRange)range;

字符串转换

@property (readonly) double doubleValue;
@property (readonly) float floatValue;
@property (readonly) int intValue;
@property (readonly) NSInteger integerValue;
@property (readonly) long long longLongValue;
@property (readonly) BOOL boolValue;

//将字符串的所有字符转化成大写
@property (readonly,copy)NSString *uppercaseString;
//将字符串的所有字符转化为小写
@property (readonly,copy)NSString *lowercaseString;
// 所有单词的首字母转化成大写
@property (readonly,copy)NSString *capitalizedString;

//所有字符转化成大写 本地化
- (NSString *)uppercaseStringWithLocale:(NSLocale *)localeNS_AVAILABLE(10_8,6_0);
//所有字符串转化成小写 本地化
- (NSString *)lowercaseStringWithLocale:(NSLocale *)localeNS_AVAILABLE(10_8,6_0);
//所有单词首字母转化成大写 本地化
- (NSString *)capitalizedStringWithLocale:(NSLocale *)localeNS_AVAILABLE(10_8,6_0);

//默认本地化所有字符转化成大写
@property (readonly, copy) NSString *localizedUppercaseString NS_AVAILABLE(10_11, 9_0);
//默认本地化所有字符串转化成小写
@property (readonly, copy) NSString *localizedLowercaseString NS_AVAILABLE(10_11, 9_0);
//默认本地化所有单词首字母转化成大写
@property (readonly, copy) NSString *localizedCapitalizedString NS_AVAILABLE(10_11, 9_0);

字符串分行,分段

   //////////分行//////////
//1.指定范围,分行取字符串
- (void)getLineStart:(nullable NSUInteger *)startPtr end:(nullable NSUInteger *)lineEndPtr contentsEnd:(nullable NSUInteger *)contentsEndPtr forRange:(NSRange)range;
//2.获取指定范围该行的范围
- (NSRange)lineRangeForRange:(NSRange)range;

   //////////分段//////////
//3.指定范围,分段取字符串
- (void)getParagraphStart:(nullable NSUInteger *)startPtr end:(nullable NSUInteger *)parEndPtr contentsEnd:(nullable NSUInteger *)contentsEndPtr forRange:(NSRange)range;
//4.获取指定范围该段落的范围
- (NSRange)paragraphRangeForRange:(NSRange)range;

  //////////字符串分行,分段//////////
    NSString *string = @"123 456\nABC,DEF\nabc.def";
    //获取该行的范围(指定范围)
    NSRange range1 = [string lineRangeForRange:NSMakeRange(0, 10)];
    NSLog(@"%ld 行长度:     %ld", range1.location, range1.length);
    //输出:       0 行长度:     16

    //获取该段落范围(指定范围)
    NSRange range2 = [string paragraphRangeForRange:NSMakeRange(0, 3)];
    NSLog(@"%ld 段落长度:   %ld", range2.location, range2.length);
    //输出:       0 段落长度:   8

字符串枚举方法

typedef NS_OPTIONS(NSUInteger, NSStringEnumerationOptions) {
    // Pass in one of the "By" options:
    NSStringEnumerationByLines = 0,                       // 按行
    NSStringEnumerationByParagraphs = 1,                  // 按段落
    NSStringEnumerationByComposedCharacterSequences = 2,  // 按字符顺序
    NSStringEnumerationByWords = 3,                       // 按单词,字
    NSStringEnumerationBySentences = 4,                   // 按句子
    NSStringEnumerationReverse = 1UL << 8,                // 反向遍历
    NSStringEnumerationSubstringNotRequired = 1UL << 9,   // 不需要子字符串
    NSStringEnumerationLocalized = 1UL << 10              // 本地化
};

// 检查是否在指定范围内是否有匹配的字符串
- (void)enumerateSubstringsInRange:(NSRange)range options:(NSStringEnumerationOptions)opts usingBlock:(void (^)(NSString * _Nullable substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop))block NS_AVAILABLE(10_6, 4_0);
// 列举枚举字符串所有行
- (void)enumerateLinesUsingBlock:(void (^)(NSString *line, BOOL *stop))block NS_AVAILABLE(10_6, 4_0);

   //////////使用例子//////////    
   NSString *string = @"123456\nABCDEF\nabcdef
    //1.列举(按行)
   [string enumerateLinesUsingBlock:^(NSString * _Nonnull line, BOOL * _Nonnull stop) {
       NSLog(@"每行:   %@", line);
   }];
    //输出:    每行:   123456
    //输出:    每行:   ABCDEF
    //输出:    每行:   abcdef

    //2.列举(范围,条件)
    [string enumerateSubstringsInRange:NSMakeRange(5, 10) options:NSStringEnumerationByLines usingBlock:^(NSString * _Nullable substring, NSRange substringRange, NSRange enclosingRange, BOOL * _Nonnull stop) {

        NSLog(@"%@", substring);
        NSLog(@"%ld   %ld", substringRange.location, substringRange.length);
        NSLog(@"%ld   %ld", enclosingRange.location, enclosingRange.length);

    }];
    //输出:   6
    //输出:   5 1
    //输出:   5 2

    //输出:   ABCDEF
    //输出:   7   6
    //输出:   7   7

    //输出:   a
    //输出:   14   1
    //输出:   14   1

编码相关


NS_ENUM(NSStringEncoding) {
    NSASCIIStringEncoding = 1,      /* 0..127 only */
    NSNEXTSTEPStringEncoding = 2,
    NSJapaneseEUCStringEncoding = 3,
    NSUTF8StringEncoding = 4,
    NSISOLatin1StringEncoding = 5,
    NSSymbolStringEncoding = 6,
    NSNonLossyASCIIStringEncoding = 7,
    NSShiftJISStringEncoding = 8,          /* kCFStringEncodingDOSJapanese */
    NSISOLatin2StringEncoding = 9,
    NSUnicodeStringEncoding = 10,
    NSWindowsCP1251StringEncoding = 11,    /* Cyrillic; same as AdobeStandardCyrillic */
    NSWindowsCP1252StringEncoding = 12,    /* WinLatin1 */
    NSWindowsCP1253StringEncoding = 13,    /* Greek */
    NSWindowsCP1254StringEncoding = 14,    /* Turkish */
    NSWindowsCP1250StringEncoding = 15,    /* WinLatin2 */
    NSISO2022JPStringEncoding = 21,        /* ISO 2022 Japanese encoding for e-mail */
    NSMacOSRomanStringEncoding = 30,
    NSUTF16StringEncoding = NSUnicodeStringEncoding,      /* An alias for NSUnicodeStringEncoding */
    NSUTF16BigEndianStringEncoding = 0x90000100,          /* NSUTF16StringEncoding encoding with explicit endianness specified */
    NSUTF16LittleEndianStringEncoding = 0x94000100,       /* NSUTF16StringEncoding encoding with explicit endianness specified */
    NSUTF32StringEncoding = 0x8c000100,
    NSUTF32BigEndianStringEncoding = 0x98000100,          /* NSUTF32StringEncoding encoding with explicit endianness specified */
    NSUTF32LittleEndianStringEncoding = 0x9c000100        /* NSUTF32StringEncoding encoding with explicit endianness specified */
    };
// UTF8编码值
@property (nullable, readonly) const char *UTF8String;
// 最快编码值
@property (readonly) NSStringEncoding fastestEncoding;
// 自小编码值
@property (readonly) NSStringEncoding smallestEncoding;

// 选择编码,是否允许有损编码
- (nullable NSData *)dataUsingEncoding:(NSStringEncoding)encoding allowLossyConversion:(BOOL)lossy;
// 选择编码
- (nullable NSData *)dataUsingEncoding:(NSStringEncoding)encoding;
// 判断是否可以无损编码
- (BOOL)canBeConvertedToEncoding:(NSStringEncoding)encoding;

// C字符编码转换
- (nullable const char *)cStringUsingEncoding:(NSStringEncoding)encoding ;
// 判断C字符转化是否可以成功
- (BOOL)getCString:(char *)buffer maxLength:(NSUInteger)maxBufferCount encoding:(NSStringEncoding)encoding;
// 指定缓存区转换
- (BOOL)getBytes:(nullable void *)buffer maxLength:(NSUInteger)maxBufferCount usedLength:(nullable NSUInteger *)usedBufferCount encoding:(NSStringEncoding)encoding options:(NSStringEncodingConversionOptions)options range:(NSRange)range remainingRange:(nullable NSRangePointer)leftover;
// 对字符串进行编码时所需的最大字节数
- (NSUInteger)maximumLengthOfBytesUsingEncoding:(NSStringEncoding)enc;
// 对字符串进行编码时所需的字节数
- (NSUInteger)lengthOfBytesUsingEncoding:(NSStringEncoding)enc;

// 可用字符串编码
+ (const NSStringEncoding *)availableStringEncodings;
// 本地化编码名称
+ (NSString *)localizedNameOfStringEncoding:(NSStringEncoding)encoding;
// 默认C字符串编码
+ (NSStringEncoding)defaultCStringEncoding;

// unicode范式D标准化
@property (readonly,copy)NSString *decomposedStringWithCanonicalMapping;
// unicode范式c标准化
@property (readonly,copy)NSString *precomposedStringWithCanonicalMapping;
// unicode范式KD标准化
@property (readonly,copy)NSString *decomposedStringWithCompatibilityMapping;
// unicode范式KC标准化
@property (readonly,copy)NSString *precomposedStringWithCompatibilityMapping;

字符串分割

/*
 NSCharacterSet
 controlCharacterSet                 控制符
 whitespaceCharacterSet              空格符
 whitespaceAndNewlineCharacterSet   空格换行符
 decimalDigitCharacterSet            小数
 letterCharacterSet                  文字
 lowercaseLetterCharacterSet         小写字母
 uppercaseLetterCharacterSet         大写字母
 nonBaseCharacterSet                 非基础
 alphanumericCharacterSet            数字字母
 decomposableCharacterSet            可分解
 illegalCharacterSet                 非法
 punctuationCharacterSet             标点
 capitalizedLetterCharacterSet       大写
 symbolCharacterSet                  符号
 newlineCharacterSet                 换行符
 */

//分割(指定字符串)
- (NSArray<NSString *> *)componentsSeparatedByString:(NSString *)separator;

//分割(指定字符集合)
- (NSArray<NSString *> *)componentsSeparatedByCharactersInSet:(NSCharacterSet *)separator NS_AVAILABLE(10_5, 2_0);
        //////////使用例子//////////
        NSString *string = @"A_B_c_D_E_F";

        //分割(指定字符串)
        NSArray *resultArr1 = [string componentsSeparatedByString:@"_"];
        NSLog(@"%@", resultArr1);
        //输出:   (A, B, c, D, E, F)

        //分割(指定字符集合)
        NSArray *resultArr2 = [string componentsSeparatedByCharactersInSet:[NSCharacterSet lowercaseLetterCharacterSet]];
        NSLog(@"%@", resultArr2);
        //输出:   ("A_B_" , "_D_E_F")

字符串操作(修剪,填充,折叠,替换)

    NSString *string = @"3EWRs a;af";

    //////////修剪//////////
    NSString *result1 = [string stringByTrimmingCharactersInSet:[NSCharacterSet lowercaseLetterCharacterSet]];
    NSLog(@"%@", result1);
    //输出:   3EWRs a;


    //////////填充//////////
    NSString *result2 = [string stringByPaddingToLength:20 withString:@"填充" startingAtIndex:1];
    NSLog(@"%@", result2);
    //输出:   3EWRs a;af充填充填充填充填充填


    //////////折叠//////////
    NSString *result3 = [string stringByFoldingWithOptions:NSNumericSearch locale:[NSLocale systemLocale]];
    NSLog(@"%@", result3);
    //输出:   3EWRs a;af


    //////////替换//////////
    //替换(指定字符串)
    NSString *result4 = [string stringByReplacingOccurrencesOfString:@" " withString:@"替换"];
    NSLog(@"%@", result4);
    //输出:   3EWRs替换a;af


    //替换(指定字符串,条件,范围)
    NSString *result5 = [string stringByReplacingOccurrencesOfString:@"a" withString:@"替换" options:NSRegularExpressionSearch range:NSMakeRange(0, string.length - 2)];
    NSLog(@"%@", result5);
    //输出:   3EWRs 替换;af


    //替换(指定范围)
    NSString *result6 = [string stringByReplacingCharactersInRange:NSMakeRange(0, string.length) withString:@"替换"];
    NSLog(@"%@", result6);
    //输出:   替换

字符串翻译

//翻译选择
NSStringTransformLatinToKatakana    拉丁->片假名
NSStringTransformLatinToHiragana    拉丁->平假名
NSStringTransformLatinToHangul  拉丁->韩语
NSStringTransformLatinToArabic  拉丁->阿拉伯语
NSStringTransformLatinToHebrew  拉丁->希伯来语
NSStringTransformLatinToThai    拉丁->泰国
NSStringTransformLatinToCyrillic    拉丁->西里尔字母
NSStringTransformLatinToGreek   拉丁->希腊
NSStringTransformToLatin    拉丁
NSStringTransformMandarinToLatin    普通话->拉丁
NSStringTransformHiraganaToKatakana     平假名->片假名
NSStringTransformFullwidthToHalfwidth   全角->半角
NSStringTransformToXMLHex   XML16进制
NSStringTransformToUnicodeName  Unicode名
NSStringTransformStripCombiningMarks    结合地带商标
NSStringTransformStripDiacritics    带音符

//////////字符串翻译//////////
NSString *dalian = @"大连";
NSString *result = [dalian stringByApplyingTransform:NSStringTransformMandarinToLatin reverse:NO];
NSLog(@"%@", result);
//输出:   dà lián

字符串写入

//////////字符串写入//////////
    //写入到指定路径,编码的文件中
    [string writeToFile:@"/Users/Desktop/LuisX.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];

    //写入到指定URL,编码的文件中
    [string writeToURL:[NSURL URLWithString:@"file://LuisX.text"] atomically:YES encoding:NSUTF8StringEncoding error:nil];

NSMutableString

    NSMutableString *str = [NSMutableString stringWithString:@"string"];

    //////////插入//////////
    [str insertString:@"123" atIndex:2];
    NSLog(@"%@", str);
    //输出:   st123ring

    //////////删除//////////
    [str deleteCharactersInRange:NSMakeRange(2, 2)];
    NSLog(@"%@", str);
    //输出:   st3ring

    //////////拼接//////////
    [str appendString:@"456"];
    NSLog(@"%@", str);
    //输出:   st3ring456

    //////////格式化拼接//////////
    [str appendFormat:@"7 89"];
    NSLog(@"%@", str);
    //输出:   st3ring4567 89

    //////////设置新字符串//////////
    [str setString:@"string"];
    NSLog(@"%@", str);
    //输出:   string

    //////////字符串替换//////////
    //1.指定范围替换
    [str1 replaceCharactersInRange:NSMakeRange(2, 2) withString:@"123"];
    NSLog(@"%@", str1);
    //输出:   st123ng

    //2.指定字符串,条件,范围替换
    [str1 replaceOccurrencesOfString:@"123" withString:@"--" options:NSRegularExpressionSearch range:NSMakeRange(0, str1.length)];
    NSLog(@"%@", str1);
    //输出:   st--ng

全部来自玩转NSString

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

推荐阅读更多精彩内容

  • 1.项目经验 2.基础问题 3.指南认识 4.解决思路 ios开发三大块: 1.Oc基础 2.CocoaTouch...
    阳光的大男孩儿阅读 4,967评论 0 13
  • 307、setValue:forKey和setObject:forKey的区别是什么? 答:1, setObjec...
    AlanGe阅读 1,523评论 0 1
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,121评论 29 470
  • iOS面试小贴士 ———————————————回答好下面的足够了------------------------...
    不言不爱阅读 1,959评论 0 7
  • Activity.finish(); 这是一个结束activity的动作, 当activity需要进行关闭的时候,...
    往之_阅读 971评论 0 0