天天看点

NSString Class Reference

        NSString声明了一系列不可变字符串的接口,当通过NSString创建一个字符串时,就代表这个字符串对象是不可变的。当你想使用可变字符串时,可以使用NSMutableString。

        NSString实现了两个通用的方法length和characterAtIndex:。length可以获得字符串的长度;characterAtIndex:可以通过索引获得字符串中指定位置的字符,其索引的起始位置是0。

        NSString还声明查找和比较字符串的接口,而且还声明了NSString转数值类型、组合字符串的接口。

关于NSMutableString的编程介绍详见《NSMutableString Class Reference》

初始化字符串

+ string

- init

- initWithBytes:length:encoding:

- initWithBytesNoCopy:length:encoding:freeWhenDone:

- initWithCharacters:length:

- initWithCharactersNoCopy:length:freeWhenDone:

- initWithString:

- initWithCString:encoding:

- initWithUTF8String:

- initWithFormat:

- initWithFormat:arguments:

- initWithFormat:locale:

- initWithFormat:locale:arguments:

- initWithData:encoding:

+ stringWithFormat:

+ localizedStringWithFormat:

+ stringWithCharacters:length:

+ stringWithString:

+ stringWithCString:encoding:

+ stringWithUTF8String:

#pragma mark - 初始化字符串
- (void)testCreatingAndInitializingStrings {

    // 空字符串
    NSString *string = [NSString string];
    string = [[NSString alloc] init];
    string = @"";

    // 通过字符串生成字符串
    string = [NSString stringWithString:string];
    string = [[NSString alloc] initWithString:string];
    string = string;

    // 通过char生成NSString
    string = [NSString stringWithUTF8String:"阳君"];
    string = [[NSString alloc] initWithUTF8String:"阳君"];

    // 组合生成NSString
    string = [NSString stringWithFormat:@"%@", @"阳君"];
    string = [[NSString alloc] initWithFormat:@"%@", @"阳君"];

    // 通过utf-8字符串
    string = [NSString stringWithUTF8String:string.UTF8String];
    string = [[NSString alloc] initWithUTF8String:string.UTF8String];

    // 通过C字符串
    const char *cStr = [string cStringUsingEncoding:NSUTF8StringEncoding];
    string = [NSString stringWithCString:cStr encoding:NSUTF8StringEncoding];
    string = [[NSString alloc] initWithCString:cStr encoding:NSUTF8StringEncoding];

}
           

通过NSString路径读取文件内容

+ stringWithContentsOfFile:encoding:error:

- initWithContentsOfFile:encoding:error:

+ stringWithContentsOfFile:usedEncoding:error:

- initWithContentsOfFile:usedEncoding:error:

#pragma mark 测试数据
- (NSString *)testData {

    // 获取应用中Document文件夹
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:];

    // 测试数据
    NSString *string = @"阳君;937447974";
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"test.plist"];
    NSError *error;
    [string writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:&error];
    if (error) {
        NSLog(@"错误:%@", error.localizedDescription);
    }
    return filePath;

}

#pragma mark - 通过NSString路径读取文件内容
- (void)testCreatingAndInitializingFromFile {

    NSString *filePath = [self testData];
    NSError *error;

    // 指定编码格式读取
    NSString *string = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&error];
    string = [[NSString alloc] initWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&error];

    // 自动打开,并返回解析的编码模式
    NSStringEncoding enc;
    string = [NSString stringWithContentsOfFile:filePath usedEncoding:&enc error:&error];
    string = [[NSString alloc] initWithContentsOfFile:filePath usedEncoding:&enc error:&error];

    if (error) {
        NSLog(@"错误:%@", error.localizedDescription);
    }

}
           

通过NSURL路径读取文件内容

+ stringWithContentsOfURL:encoding:error:

- initWithContentsOfURL:encoding:error:

+ stringWithContentsOfURL:usedEncoding:error:

- initWithContentsOfURL:usedEncoding:error:

#pragma mark 通过NSURL路径读取文件内容
- (void)testCreatingAndInitializingFromURL {

    NSString *filePath = [self testData];
    NSURL *fileUrl = [NSURL fileURLWithPath:filePath];
    NSError *error;

    // 指定编码格式读取
    NSString *string = [NSString stringWithContentsOfURL:fileUrl encoding:NSUTF8StringEncoding error:&error];
    string = [[NSString alloc] initWithContentsOfURL:fileUrl encoding:NSUTF8StringEncoding error:&error];

    // 自动打开,并返回解析的编码模式
    NSStringEncoding enc;
    string = [NSString stringWithContentsOfURL:fileUrl usedEncoding:&enc error:&error];
    string = [[NSString alloc] initWithContentsOfURL:fileUrl usedEncoding:&enc error:&error];

    if (error) {
        NSLog(@"错误:%@", error.localizedDescription);
    }

}
           

通过NSString或NSURL路径写入NSString

- writeToFile:atomically:encoding:error:

- writeToURL:atomically:encoding:error:

#pragma mark 通过NSString或NSURL路径写入NSString
- (void)testWritingFileOrURL {

    NSString *filePath = [self testData];
    NSURL *fileUrl = [NSURL fileURLWithPath:filePath];
    NSError *error;
    NSString *string = @"阳君;937447974";

    // 指定编码格式写入
    BOOL write = [string writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:&error];
    write = [string writeToURL:fileUrl atomically:YES encoding:NSUTF8StringEncoding error:&error];

    if (error) {
        NSLog(@"错误:%@", error.localizedDescription);
    }

}
           

获取字符串长度

length Property

- lengthOfBytesUsingEncoding:

- maximumLengthOfBytesUsingEncoding:

#pragma mark - 获取字符串长度
- (void)testGettingLength {

    NSString *string = @"阳君;937447974";

    // 长度
    NSInteger length = string.length;

    // 指定编码格式后的长度
    length = [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding];

    // 返回存储时需要指定的长度
    length  = [string maximumLengthOfBytesUsingEncoding:NSUTF8StringEncoding];

}
           

获取Characters和Bytes

- characterAtIndex:

- getCharacters:range:

- getBytes:maxLength:usedLength:encoding:options:range:remainingRange:

#pragma mark 获取Characters和Bytes
- (void)testGettingCharactersAndBytes {

    NSString *string = @"YangJun;937447974";

    // 提取指定位置的character
    unichar uch = [string characterAtIndex];

    // 提取Bytes,并返回使用的长度
    NSUInteger length = [string maximumLengthOfBytesUsingEncoding:NSUTF8StringEncoding];
    const void *bytes;
    NSRange range = ,};
    BOOL gByte = [string getBytes:&bytes maxLength:length usedLength:&length encoding:NSUTF8StringEncoding options:NSStringEncodingConversionAllowLossy range:range remainingRange:nil];
    NSLog(@"%d", gByte);

    // 有问题
    [string getCharacters:&uch range:range];

}
           

获取C字符串

- cStringUsingEncoding:

- getCString:maxLength:encoding:

UTF8String Property

#pragma mark 获取C字符串
- (void)testGettingCStrings {

    NSString *string = @"阳君;937447974";

    // 指定编码格式,获取C字符串
    const char *c = [string cStringUsingEncoding:NSUTF8StringEncoding];
    NSLog(@"%s", c);

    // 获取通过UTF-8转码的字符串
    const char *UTF8String = [string UTF8String];
    NSLog(@"%s", UTF8String);

    /** 有线程问题
    char *cString;
    NSUInteger length = [string maximumLengthOfBytesUsingEncoding:NSUTF8StringEncoding];
    BOOL bGet = [string getCString:cString maxLength:length encoding:NSUTF8StringEncoding];
    NSLog(@"%d, %s", bGet, cString);
     */

}
           

增加字符串

- stringByAppendingFormat:

- stringByAppendingString:

- stringByPaddingToLength:withString:startingAtIndex:

#pragma mark - 增加字符串
- (void)testCombiningStrings {

    NSString *string = @"阳君;937447974";

    // string后增加字符串并生成一个新的字符串
    string = [string stringByAppendingString:@";IOS"];

    // string后增加组合字符串并生成一个新的字符串
    string = [string stringByAppendingFormat:@";%@", @"OC"];

    // string后增加循环字符串,stringByPaddingToLength:完毕后截取的长度;startingAtIndex:从增加的字符串第几位开始循环增加。
    string = [string stringByPaddingToLength: withString:@";Swift" startingAtIndex:];

}
           

分割字符串

- componentsSeparatedByString:

- componentsSeparatedByCharactersInSet:

- stringByTrimmingCharactersInSet:

- substringFromIndex:

- substringWithRange:

- substringToIndex:

#pragma mark 分割字符串
- (void)testDividingStrings {

    NSString *string = @"阳君;Yj937447974";

    // 根据指定的字符串分割成数组
    NSArray<NSString *> *array = [string componentsSeparatedByString:@";"];

    // 通过系统自带的分割方式分割字符串
    NSCharacterSet *set = [NSCharacterSet lowercaseLetterCharacterSet];
    array = [string componentsSeparatedByCharactersInSet:set];
    // 没啥用
    string = [string stringByTrimmingCharactersInSet:set];

    // 返回指定位置后的字符串
    string = @"阳君;937447974";
    string = [string substringFromIndex:];

    // 返回指定范围的字符串
    string = @"阳君;937447974";
    NSRange range = {, };
    string = [string substringWithRange:range];

    // 返回指定位置钱的字符串
    string = @"阳君;937447974";
    string = [string substringToIndex:];

}
           

查找字符串

- rangeOfCharacterFromSet:

- rangeOfCharacterFromSet:options:

- rangeOfCharacterFromSet:options:range:

- rangeOfString:

- rangeOfString:options:

- rangeOfString:options:range:

- rangeOfString:options:range:locale:

- enumerateLinesUsingBlock:

- enumerateSubstringsInRange:options:usingBlock:

#pragma mark - 查找字符串
- (void)testFindingCharactersAndSubstrings {

    NSString *string = @"阳君;937447974";
    NSRange searchRange = , string.length};

    NSCharacterSet *set = [NSCharacterSet uppercaseLetterCharacterSet];
    // 根据NSCharacterSet查找
    NSRange range = [string rangeOfCharacterFromSet:set];

    // 根据NSCharacterSet查找,并选择查找模式
    range = [string rangeOfCharacterFromSet:set options:NSCaseInsensitiveSearch];

    // 根据NSCharacterSet查找,并选择查找模式,以及范围
    range = [string rangeOfCharacterFromSet:set options:NSCaseInsensitiveSearch range:searchRange];

    // 根据字符串查找
    range = [string rangeOfString:@"93"];
    range = [string rangeOfString:@"93" options:NSCaseInsensitiveSearch];
    range = [string rangeOfString:@"93" options:NSCaseInsensitiveSearch range:searchRange];
    range = [string rangeOfString:@"93" options:NSCaseInsensitiveSearch range:searchRange locale:nil];

    // block 查找
    [string enumerateLinesUsingBlock:^(NSString * _Nonnull line, BOOL * _Nonnull stop) {
        NSLog(@"%@", line);
        if ([@"93" isEqualToString:line]) {
            NSLog(@"search");
            *stop = YES;
        }
    }];

    // block查找,可设置查找方式,并得到找到的位置
    [string enumerateSubstringsInRange:searchRange options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString * _Nullable substring, NSRange substringRange, NSRange enclosingRange, BOOL * _Nonnull stop) {
        NSLog(@"%@", substring);
        if ([@"9" isEqualToString:substring]) {
            NSLog(@"location:%d; length:%d", substringRange.location, substringRange.length);
            NSLog(@"location:%d; length:%d", enclosingRange.location, enclosingRange.length);
            *stop = YES;
        }
    }];

}
           

替换字符串

- stringByReplacingOccurrencesOfString:withString:

- stringByReplacingOccurrencesOfString:withString:options:range:

- stringByReplacingCharactersInRange:withString:

#pragma mark 替换字符串
- (void)testReplacingSubstrings {

    NSString *string = @"阳君;937447974";
    NSRange searchRange = {, string.length};

    // 全局替换
    string = [string stringByReplacingOccurrencesOfString:@";" withString:@";;"];

    // 设置替换的模式,并设置范围
    string = [string stringByReplacingOccurrencesOfString:@";" withString:@"-" options:NSCaseInsensitiveSearch range:searchRange];

    // 将指定范围的字符串替换为指定的字符串
    string = [string stringByReplacingCharactersInRange:searchRange withString:@"1"];

}
           

识别和比较字符串

- caseInsensitiveCompare:

- localizedCaseInsensitiveCompare:

- compare:

- localizedCompare:

- compare:options:

- compare:options:range:

- compare:options:range:locale:

- localizedStandardCompare:

- hasPrefix:

- hasSuffix:

- isEqualToString:

hash Property

#pragma mark - 识别和比较字符串
- (void)testIdentifyingAndComparingStrings {

    NSString *string = @"阳君;937447974";
    NSString *compareStr = @"阳君;837447974";
    NSRange searchRange = {, string.length};

    // 比较大小
    NSComparisonResult result = [string compare:compareStr];

    // 前缀比较
    BOOL isHas = [string hasPrefix:@"阳君"];

    // 后缀比较
    isHas = [string hasSuffix:@"4"];

    // 全比较是否相同
    isHas = [string isEqualToString:compareStr];

    // 通过指定的比较模式,比较字符串
     result = [string compare:compareStr options:NSCaseInsensitiveSearch];
    // 等价
    result = [string caseInsensitiveCompare:compareStr];
    // 添加比较范围
    result = [string compare:compareStr options:NSCaseInsensitiveSearch range:searchRange];
    // 增加比较地域
    result = [string compare:compareStr options:NSCaseInsensitiveSearch range:searchRange locale:nil];

    // 本地化字符串,再比较
    result = [string localizedCompare:compareStr];
    result = [string localizedStandardCompare:compareStr];
    // NSCaseInsensitiveSearch模式
    result = [string localizedCaseInsensitiveCompare:compareStr];

    // hash值
    NSUInteger hash = string.hash;
    NSLog(@"hash:%lu", (unsigned long)hash);

}
           

字符串折叠

- stringByFoldingWithOptions:locale:

#pragma mark 字符串折叠
- (void)testFoldingStrings {

    NSString *string = @"阳君;937447974";

    // 前缀检验,如果相同,就返回前缀
    string = [string commonPrefixWithString:@"君;" options:NSCaseInsensitiveSearch];

}
           

获得共享的前缀

- commonPrefixWithString:options:

#pragma mark 获得共享的前缀
- (void)testGettingSharedPrefix {

    NSString *string = @"阳君;937447974";
    NSString *compareStr = @"阳君;837447974";

    // 返回两个字符串相同的前缀
    string = [string commonPrefixWithString:compareStr options:NSCaseInsensitiveSearch];

}
           

大小写变化

capitalizedString Property

- capitalizedStringWithLocale:

lowercaseString Property

- lowercaseStringWithLocale:

uppercaseString Property

- uppercaseStringWithLocale:

#pragma mark - 大小写变化
- (void)testChangingCase {

    NSString *string = @"阳君;y937447974J";
    NSLocale *locale = [NSLocale currentLocale];

    // 全变大写
    NSString *result = string.capitalizedString;
    // 指定系统环境变化
    result =  [string capitalizedStringWithLocale:locale];

    // 全变大写
    result = string.uppercaseString;
    result = [string uppercaseStringWithLocale:locale];

    // 全变小写
    result = string.lowercaseString;
    result = [string lowercaseStringWithLocale:locale];

}
           

转数值

doubleValue Property

floatValue Property

intValue Property

integerValue Property

longLongValue Property

boolValue Property

#pragma mark 得到数值
- (void)testGettingNumericValues {

    NSString *string = @"123";

    NSLog(@"doubleValue:%f", string.doubleValue);
    NSLog(@"floatValue:%f", string.floatValue);
    NSLog(@"intValue:%d", string.intValue);
    NSLog(@"integerValue:%d", string.integerValue);
    NSLog(@"longLongValue:%lld", string.longLongValue);
    NSLog(@"boolValue:%hhd", string.boolValue);

}
           

使用路径

+ pathWithComponents:

pathComponents Property

- completePathIntoString:caseSensitive:matchesIntoArray:filterTypes:

fileSystemRepresentation Property

- getFileSystemRepresentation:maxLength:

absolutePath Property

lastPathComponent Property

pathExtension Property

stringByAbbreviatingWithTildeInPath Property

- stringByAppendingPathComponent:

- stringByAppendingPathExtension:

stringByDeletingLastPathComponent Property

stringByDeletingPathExtension Property

stringByExpandingTildeInPath Property

stringByResolvingSymlinksInPath Property

stringByStandardizingPath Property

- stringsByAppendingPaths:

#pragma mark - 使用路径
- (void)testWorkingWithPaths {

    // 获取应用中Document文件夹
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:];

    // 路径拆分为数组中的元素
    NSArray<NSString *> *pathComponents = documentsDirectory.pathComponents;
    // 将数组中的元素拼接为路径
    documentsDirectory = [NSString pathWithComponents:pathComponents];

    // 加载测试数据
    NSString *string = @"阳君;937447974";
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"test.plist"];
    [string writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil];
    filePath = [documentsDirectory stringByAppendingPathComponent:@"test1.plist"];
    [string writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil];
    // 寻找文件夹下包含指定扩展名的文件路径
    NSString *outputName;// 相同的前缀
    NSArray *filterTypes = [NSArray arrayWithObjects:@"txt", @"plist", nil];
    NSUInteger matches = [documentsDirectory completePathIntoString:&outputName caseSensitive:YES matchesIntoArray:&pathComponents filterTypes:filterTypes];
    NSLog(@"找到:%d", matches);

    // 添加路径
    filePath = [documentsDirectory stringByAppendingPathComponent:@"test"];
    // 添加扩展名
    filePath = [filePath stringByAppendingPathExtension:@"plist"];

    // 是否绝对路径
    NSLog(@"absolutePath:%d", filePath.absolutePath);

    // 最后一个路径名
    NSLog(@"lastPathComponent:%@", filePath.lastPathComponent);

    // 扩展名
    NSLog(@"pathExtension:%@", filePath.pathExtension);

    // 去掉扩展名
    string = filePath.stringByDeletingPathExtension;

    // 去掉最后一个路径
    string = filePath.stringByDeletingLastPathComponent;

    // 批量增加路径,并返回生成的路径
    pathComponents = [filePath stringsByAppendingPaths:pathComponents];

    // 没啥用
    string = filePath.stringByExpandingTildeInPath;
    string = filePath.stringByResolvingSymlinksInPath;
    string = filePath.stringByStandardizingPath;

}
           

使用URL

- stringByAddingPercentEncodingWithAllowedCharacters:

- stringByRemovingPercentEncoding

#pragma mark 使用URL
- (void)testWorkingWithURLs {

    NSString *path = @"阳君/937447974";

    NSCharacterSet *set = [NSCharacterSet controlCharacterSet];

    // 转%格式码
    NSString *string = [path stringByAddingPercentEncodingWithAllowedCharacters:set];

    // 转可见
    string = string.stringByRemovingPercentEncoding;

}
           

其他

参考资料

String Programming Guide

NSString Class Reference

文档修改记录

时间 描述
2015-10-21 根据IOS9的NSString API总结

版权所有:http://blog.csdn.net/y550918116j