您好,欢迎访问代码之道!登录后台查看权限
  • 欢迎大神光临
  • 有朋自远方来 不亦悦乎

Objective-C入门2:NSString

Objective-C 老刘 2018-02-10 645 次浏览 0个评论

在OC中用NSString对象存储字符串。

NSString对象创建和初始化

NSString创建和初始化一般是先用静态方法alloc再用initXxx方法初始化,当然NSString其实也有对应的静态的方法将alloc和init一并做stringXxx静态方法。

测试代码:

#import

int main(int argc, const char *argv[]) {
    @autoreleasepool {
        NSString *s1 = @"测试字符串1";
        NSLog(@">>\n%@", s1);
        NSString *s2 = [[NSString alloc]initWithUTF8String:"测试字符串2"];
        NSLog(@">>\n%@", s2);
        NSString *s3 = [[NSString alloc]initWithCString:"测试字符串3" encoding:NSUTF8StringEncoding];
        NSLog(@">>\n%@", s3);
        char b1[] = {'a', 'b', 'c'};
        NSString *s4 = [[NSString alloc]initWithBytes:b1  length:sizeof(b1) encoding:NSASCIIStringEncoding];
        NSLog(@">>\n%@", s4);
        NSString *s5 = [[NSString alloc]initWithFormat:@"a=%d,b=%d",1,2];
        NSLog(@">>\n%@", s5);
    }
    return 0;
}

代码分析

  • s1 直接将一个@“”字面量赋值给一个NSString指针
  • s2 用UTF8格式的C字符串初始化NSString对象
  • s3 用指定编码的C字符串初始化NSString对象
  • s4 过一个字节数组初始化一个字符串,和C字符串不同的是,字节数组没有以0结尾,所以需要指定数据长度
  • s5 用格式化方式初始化一个NSString对象

用URL的内容初始化字符串

这个方法超方便,加载网络内容不用写复杂的http请求。

#import <Foundation/Foundation.h>

int main(int argc, const char *argv[]) {
    @autoreleasepool {
        NSError *e = nil;
        NSURL *bd = [[NSURL alloc]initWithString:@"https://baidu.com"];
        NSString *c = [[NSString alloc]initWithContentsOfURL:bd  encoding:NSUTF8StringEncoding  error:&e];
        if(e) {
            NSLog(@"%@", e.localizedDescription);
        } else {
            NSLog(@"%@", c);        
        }
    }
    return 0;
} 
return 0;
}

用文件内容初始化字符串

#import <Foundation/Foundation.h>

int main(int argc, const char *argv[]) {
    @autoreleasepool {
        NSString *f1 = @"hello.txt1";
        NSError *e1;
        NSString *s1 = [[NSString alloc]initWithContentsOfFile:f1 encoding:NSUTF8StringEncoding error:&e1];
        if(nil != e1) {
            NSLog(@">>\n%@", e1.localizedDescription);
        } else {
            NSLog(@">>\n%@", s1);
        }
    }
    return 0;
}

获取字符串长度

NSString的length是指该字符串由多少一个UTF16编码单元(code unit,编码方式存储一个字符需要的最少存储空间),大于或者等于字符串个数(比如例子中的表情需要4个字节存储空间)。lengthOfBytes则是指存储为对应编码需要的实际内存空间了。

#import <Foundation/Foundation.h>
int main(int argc, const char *argv[]) {
    NSString *s1 = @"我是ap🙂";
    NSLog(@">>\n%lu", (unsigned long)s1.length);
    NSLog(@">>\n%lu", (unsigned long)[s1 lengthOfBytesUsingEncoding:NSUTF16StringEncoding]);
    return 0;
}

将字符串写到一个文件中

writeToFile方法的atomically参数比较令人费解,其实也很简单,YES会将内容先写到一个临时文件中,然后利用重命名的方法完成目标文件创建,这种方法可以避免意外宕机导致出现未写完成的文件,NO的话就是直接创建目标文件并写入了。

#import <Foundation/Foundation.h>

int main(int argc, const char*argv[]) {
    NSError *err = nil;
    NSString *text = @"这句话将写到文件内容中";
    BOOL result = [text writeToFile:@"./hehe.txt"  atomically: YES encoding:NSUTF8StringEncoding error:&err];
    if(result == YES) {
        NSLog(@"Finish");
    } else {
        NSLog(@"Error");
    }
    return 0;
}

字符串比较

前缀后缀判断,判断是否相等。

#import <Foundation/Foundation.h>

int main(int argc, const char *argv[]) {
    // 判断前缀后缀
    NSString *test1 = @"前缀|中间|后缀";
    if([test1 hasPrefix:@"前缀"]) {
        NSLog(@">>有此前缀");
    }
    if([test1 hasSuffix:@"后缀"]) {
        NSLog(@">>有此后缀");
    }
    // 判断字符串是否相等,大小写敏感
    NSString *test2 = @"abc";
    if([test2 isEqualToString:@"abc"]) {
        NSLog(@">>这两字符相等");
    }
    // 比较字符串是否相等,大小写不敏感
    NSString *test3 = @"abc";
    NSString *test4 = @"Abc";   
    NSComparisonResult result1 = [test3 caseInsensitiveCompare:test4];
    if(result1 == NSOrderedSame) { 
        NSLog(@">>这两字符串相等");
    }

    return 0;
}

获取C字符串

#import <Foundation/Foundation.h>

int main(int argc, const char *argv[]) {
    @autoreleasepool {
        NSString *string = @"haha";
        const char * cString = [string cStringUsingEncoding:NSUTF8StringEncoding];
        printf("%s\n", cString);
    }
    return 0;
}

已有 645 位网友参与,快来吐槽:

发表评论