在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 位网友参与,快来吐槽:
发表评论