引言:
在日常的开发中,我们在的Foundationl框架中用到的最多的就是NSString了,不管是界面搭建,还是网络上的数据传递。NSString都是充当着绝对的主角和基石。所以对NSString的熟练程度自然是不言而喻了。
所以对于刚刚步入ios开发的我来说总结一篇关于NSString的文章自然就显得很重要。
(一)NSString的一些用法介绍
一、最常用一些方式
1.字符串最常见的创建方式
//NSString的使用
char *s = "hello Objective-C" ;
NSString * str = @"hello " ;
- 字符串的创建
//方式一:系统会自动对象并且会自动释放内存
NSString * str2 = @"hello" ;
//方式二:手动创建,手动释放内存
NSString * str3 = [[NSString alloc]init] ;
str3 = @"yayuanzi" ;
3.格式化字符串
//格式化字符串
int a = 5 ;
int b = 6 ;
NSString *number = [NSString stringWithFormat:@"a= %d , b = %d",a,b] ;
输入栏
二、较为常用的方式
- 拼接字符串
//将str3拼接到str2上
NSString *str4 = [str2 stringByAppendingString:str3] ;
NSLog(@"str4 = %@",str4) ;
2.大小写的转换
NSString * str5 = @"yaYUANzi";
//转换小写 lowercaseString
NSString *str6 = [str5 lowercaseString];
//转换大写 uppercaseString
NSString *str7 = [str5 uppercaseString] ;
NSLog(@"str6 = %@ , str7 = %@ ",str6,str7) ;
3.前缀和后缀的判断
NSString *str8 = @"www.yayuanzi.com" ;
//判断前缀 hasPrefix
BOOL hasPreFix = [str8 hasPrefix:@"www."] ;
if (hasPreFix) {
NSLog(@"有对应的www前缀") ;
}else{
NSLog(@"没有对应的www前缀") ;
}
//判断后缀 hasSuffix
BOOL hasSuffix = [str8 hasSuffix:@".com"] ;
if (hasSuffix) {
NSLog(@"有对应的com前缀") ;
}else{
4.判断两个字符串是否相同
NSString *str9 = @"www.yayuanzi.com" ;
NSString *str10 = @"www.yayuanzi.com" ;
if ([str9 isEqualToString: str10]) {
NSLog(@"两个字符串相同") ;
}else{
NSLog(@"两个字符串不相同") ;
}
//比较字符串
NSComparisonResult方法:这个方法比较特殊,后面单独的回去说.
5.字符串的分割
NSRange的定义可以理解为从location开始的length个元素
typedef struct _NSRange {
NSUInteger location; //表示对象开始的下标
NSUInteger length; //表示对象长度
} NSRange;
//分割
//按照指定的字符分割字符串
NSString *str11 = @"welcome,to,ya,yuan,zi" ;
NSArray * strArray = [str11 componentsSeparatedByString:@","] ;
for (NSString *str in strArray) {
NSLog(@"%@",str) ;
}
NSLog(@"----------按照范围截取字符串") ;
//按照范围截取字符串
//1.按照指定范围
NSRange range = NSMakeRange(1, 10) ;
NSString *str12 = [str11 substringWithRange:range] ;
NSLog(@"str12 = %@",str12) ;
//2.从某一位开始截取到最后一位
NSString *str13 = [str11 substringFromIndex:3] ;
NSLog(@"str13 = %@",str13) ;
//3.从开头开始截取到某一位
NSString *str14 = [str11 substringToIndex:4] ;
NSLog(@"str14 = %@",str14) ;
//4.将字符串拆分成每一个字符
for (int i = 0; i < [str11 length]; i++) {
NSLog(@"%c",[str11 characterAtIndex:i]) ;
}
6.字符串的查找
NSString *str15 = @"yayuanziya" ;
//查找指定字符串的位置
NSRange range1 = [str15 rangeOfString:@"ya"] ;
NSLog(@"range1.location:%ld range1.length:%ld",range1.location,range1.length) ;
7.字符串的替换
//替换
NSString *str16 = @"hello yayuanzi" ;
//替换某一个范围的内容
NSString *str17 = [str16 stringByReplacingCharactersInRange:NSMakeRange(0, 5) withString:@"你好"] ;
NSLog(@"str17 = %@",str17) ;
//用指定的字符串替换原有字符串的子串
NSString *str18 = [str16 stringByReplacingOccurrencesOfString:@"hello" withString:@"你好"] ;
NSLog(@"str18=%@",str18) ;
8.通过字符串读取文件
文件的来源:1.本地文件 2.网络文件
NSString *str19 = @"http://www.yayuanzi.com" ;
//路径类 NSURL
//网络路径
NSURL * httpURL = [NSURL URLWithString:str19] ;
//本地路径
NSURL *fileURl = [NSURL fileURLWithPath:str19] ;
//读取网络文件
NSString *httpStr = [NSString stringWithContentsOfURL:httpURL encoding:NSUTF8StringEncoding error:nil] ;
NSLog(@"httpStr = %@ ",httpStr) ;
//读取本地的文件
NSString *fileStr = [NSString stringWithContentsOfFile:@"/Users/123/Desktop/test.txt" encoding:NSUTF8StringEncoding error:nil] ;
NSLog(@"fileStr = %@",fileStr) ;
//写入本地文件
NSString *str20 = @"hello yayuanzi" ;
BOOL isOK = [str20 writeToFile:@"/Users/123/Desktop/test.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil] ;
if (isOK) {
NSLog(@"文件写入成功") ;
}else{
NSLog(@"文件写入失败") ;
}
- C和OC之间的转换
//将c转化为oc
NSString *str1 = [NSString stringWithUTF8String:s] ;
NSLog(@"str1 = %@",str1) ;
//将oc转化为c
NSLog(@"c = %s",[str UTF8String]) ;
- 把字符串转换为二进制数据
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding] ;
- 将二进制数据转换为字符串
NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding] ;
二、可变字符串的使用
- 创建可变字符串
SMutableString *mutStr = [[NSMutableString alloc]initWithCapacity:10] ;
[mutStr setString: @"hello"] ;
- 追加字符串
[mutStr appendString:@"yayuanzi"] ;
NSLog(@"sr = %@",mutStr) ;
int num = 123 ;
[mutStr appendFormat:@" - %d",num] ;
- 替换字符串
NSRange range4= [mutStr rangeOfString:@"yayuanzi"] ;
[mutStr replaceCharactersInRange:range4 withString:@"world"] ;
NSLog(@"mutstr = %@",mutStr) ;
- 插入字符串
[mutStr insertString:@"-" atIndex:5] ;
NSLog(@"sr = %@",mutStr) ;
- 删除字符串
NSRange range5 = [mutStr rangeOfString:@"hello"] ;
[mutStr deleteCharactersInRange:range5] ;
NSLog(@"sr = %@",mutStr) ;
三、 面试题
- 写一个NSString类的实现
+ (id)initWithCString:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding;
实现如下:
+ (id) stringWithCString: (const char*)nullTerminatedCString
encoding: (NSStringEncoding)encoding
{
NSString *obj;
obj = [self allocWithZone: NSDefaultMallocZone()];
obj = [obj initWithCString: nullTerminatedCString encoding: encoding];
return AUTORELEASE(obj);
}
- 判断两个NSString的字面量是否相同,为什么要用isEqualToString来判断,而不能用==来判断呢?
因为==判断的是两个指针是否相等,而NSString是分配到堆上的,每次创建的时候,指针指向的地址的不同的,所以不能用==来判断。但是这样的回答不完整。这个题感觉有点毛病,字面量本身就只有一种方式,@""; 直接创建等于赋值,这种方式创建的类型都是__NSCFConstantString,本身也不会有引用计数,所以它就是一个对象,这个是可以用==来判断的,我想题的意思应该是NSString创建的字符串,是否相等,要用isEqualToString来判断,因为字符串的创建方式不同,类型不同,地址不同,单纯从==来判断的话,不准确。
网友评论