今天来给大家介绍一下 Foundation 框架关于字符串的使用方法,方法比较多,功能介绍我都写在代码里了。好了不多说了,上代码
我们来建立一个新的类 StringTest
我们来声明一下 StringTest.h
#import <Foundation/Foundation.h>
@interface StringTest : NSObject
+ (void) test;
@end
这里我们申明了一个 静态方法 test作为方法的入口,在main函数中进行调用,注意这里是静态方法
#import <Foundation/Foundation.h>
#import "StringTest.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//类方法:
//类方法(静态方法),程序运行之初,该方法就已经分配内存空间,类方法是属于公共空间之中的。
//对象方法:
//对象方法,在调用时才进行压栈处理。
[StringTest test];//静态方法按照类名直接调用
}
return 0;
}
重点来了,下面我们来进行StringTest.m的实现,我在代码中都做了详细的注释,在这里我就不多赘述了。我们来看一下不可变字符串的用法
1、不可变字符串的创建
#pragma mark - 不可变字符串创建
/** 不可变字符串创建 */
+ (void)createString {
//NSString 不可变是指字符串的内容和长度不可变
//1.对不可变对象进行默认初始化是没有意义的
NSString *string = [[NSString alloc] init];//没有意义
NSLog(@"%p: %@",string,string);
NSLog(@"%lu",[string length]);
//2.这是创建不可变字符串最简化的方式
//首先分配空间,然后把字符串存入,最后返回空间地址
string = @"hello world";//重新创建了内存空间
NSLog(@"%p: %@",string,string);
/*
运行结果:
22016-01-04 10:09:12.187 字符串的使用[899:32212] StringTest
2016-01-04 10:09:12.189 字符串的使用[899:32212] 0x7fff794b7bd0:
2016-01-04 10:09:12.189 字符串的使用[899:32212] 0
2016-01-04 10:09:12.189 字符串的使用[899:32212] 0x100001098: hello world
*/
//系统不建议这样使用
//NSString *string2 = [[NSString alloc] initWithString:@"hello world"];
//OC字符串使用的是享元设计模式,可以节省内存资源
//享元模式:字符串创建比较消耗内存资源,当创建一个字符串时,系统会把其放入缓冲区,下次使用相同的字符串常量时时无需再次创建新的对象
NSString *string2 = @"hello world";
NSLog(@"%p: %@",string2,string2);//如果两个字符串相等,则两个地址相等
NSString *string3 = @"hello";
NSLog(@"%p: %@",string3,string3);//两个字符串不相等,则地址不相等
const char * cString = "utf-8 String";
//3.C字符串 转 OC字符串
string2 = [[NSString alloc] initWithCString: cString encoding: NSUTF8StringEncoding];
//使用类方法来创建对象时,可以省去alloc
string2 = [NSString stringWithCString: cString encoding: NSUTF8StringEncoding];
//4.格式化字符串
string2 = [[NSString alloc] initWithFormat:@"%@年%d月%d日",@"2016",1,4];
NSLog(@"%@",string2);
//字符串的拼接
NSString *str1 = @"www.";
NSString *str2 = @"baidu.com";
NSString *str3 = [NSString stringWithFormat:@"%@%@",str1,str2];
NSLog(@"str3 %@",str3);
//格式化initWithFormat:是不会从字符串缓冲区中进行存取的
//string2 = [[NSString alloc] initWithFormat:@"%@",@"hello"];
string2 = @"hello";
NSLog(@"%p: %@",string2,string2);
NSString *string6 = [[NSString alloc] initWithFormat:@"%@",@"hello"];
NSLog(@"%p: %@",string6,string6);
}
2、字符串的拼接和分割
** 字符串的拼接和分割 */
#pragma mark - 字符串的拼接和分割
+ (void)appendSeparatedString {
//字符串的拼接
//不可变字符串拼接后,会把新的字符串地址返回
NSString *string = @"www.";
//The string to append to the receiver. This value must not be nil.
string = [string stringByAppendingString:@"baidu.com"];//传入的参数一定不能为空
NSLog(@"string : %@",string);
string = [string stringByAppendingString:@“百度网站"];
NSLog(@"string :%@",string);
//字符串的分割
NSArray *components = [string componentsSeparatedByString:@"."];
NSLog(@"%@",components);
//按两个以上字符进行分割
//从给定的字符串中读取字符,存入字符集和,以.和- 进行分割
NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@".-"];
components = [string componentsSeparatedByCharactersInSet:set];
NSLog(@"%@",components);
//获取子串
string = @"www.baidu.com";
//索引值从0开始,截取子串
NSString *subString = [string substringFromIndex:4];
NSLog(@"substring: %@",subString);
/**
* 2016-01-04 14:25:35.811 字符串的使用[3816:108976] substring: baidu.com
*/
//不包含索引值对应的字符
subString = [string substringToIndex:4];//注意,不要越界
NSLog(@"substring: %@",subString);
/**
* 2016-01-04 14:28:41.554 字符串的使用[3833:109957] substring: www.
*/
//从location位置开始往后数 length长度的字符
subString = [string substringWithRange:NSMakeRange(4, 9)];
NSLog(@"substring: %@",subString);
/**
*运行结果:
*2016-01-04 14:31:34.492 字符串的使用[3846:110549] substring: baidu
*/
//获取字符串的范围
NSRange range = [string rangeOfString:@"com"];
NSLog(@"location = %lu, length = %lu",range.location,range.length);//注意,这个.是结构体中的
// location = 14, length = 3
}
3、字符串的比较方法
//** 字符串的比较方法*/
#pragma mark - 字符串的比较方法
+ (void)compareString {
NSString *string1 = @"hello";
NSString *string2 = @"hello";
//比较的是地址
if (string1 == string2) {
NSLog(@"相等");
}else {
NSLog(@"不相等");
}
//直接比较是对对象地址进行的判断,不是判断对象本身
NSString *string3 = [NSString stringWithFormat:@"%@",@"hello"];
if (string1 == string3) {
NSLog(@"相等");
}else {
NSLog(@"不相等");
}
//判断两个字符串相等 isEqualToString
//hello
//1.先判断地址是否相同,如果不同,执行第二步
//2.判断长度是否一样,如果相同,执行3
//3.逐个字符进行比较
if ([string1 isEqualToString:string3]) {
NSLog(@"相等");
}else {
NSLog(@"不相等");
}
//2.字符串的比较
//不要在OC字符串中添加 "\0"
string1 = @"abccc";
string3 = @"ba";
//根据字符的ASCII码来进行对比。从第一个字符开始,如果相等,比较下一个,如果不相等,返回比较结果
//如果长度小的字符串中的字符,和长度大中的字符前几个都相同,最后比较结果,就是按长度来进行对比
NSComparisonResult result = [string1 compare:string3];
switch (result) {
case NSOrderedAscending:
NSLog(@"string1 < string3");
break;
case NSOrderedSame:
NSLog(@"string1 = string3");
break;
case NSOrderedDescending:
NSLog(@"string1 > string3");
break;
default:
break;
}
//面试中
//通过字符串比较方法来判断两个字符串对象是否相同
string1 = nil;
string3 = @"baidu";
//为什么这里不用判断string3 为nil 。
/**
This value must not be nil. If this value is nil, the behavior is undefined and may change in future versions of OS X.
*/
if (string1 && [string1 compare:string3] == NSOrderedSame) {
NSLog(@"相同");
}else {
NSLog(@"不同");
}
// NSLog(@"%ld",(long)[string1 compare:string3]);
}
4、其他的一些方法
#pragma mark - 其他的一些方法
+ (void)otherMethods {
NSString *string = @"www.baidu.com";
NSLog(@"length = %lu",string.length);
NSLog(@"Upper: %@",string.uppercaseString);//全部转化为大写
NSLog(@"Lower: %@",string.lowercaseString);//全部转化为小写
NSLog(@"Capitalized: %@",string.capitalizedString);//首字母大写
BOOL result = [string hasPrefix:@"www."];//是否包含前缀
BOOL result1 = [string hasSuffix:@".com"];//是否包含后缀
//以后详细讲这个方法
[string getCharacters:nil range:NSMakeRange(0, 0)];
}
5、可变字符串的使用
注意一点,NSMutableString 的父类是 NSString,很多用法基本和NSString一样,大家自己去研究
+ (void)mutableString {
// NSMutableString 父类都是 NSString
// 可变指的是内存空间本身是可以更改的
// 1.创建一个空的可变字符串
NSMutableString *string = [NSMutableString string];
//string = @"123";//这是创建不可变字符串的方式
[string setString:@"可变字符串"];
//setString:每次赋值都会对原值进行全部覆盖
[string setString:@"123"];
// 2.插入字符串
[string insertString:@"可变字符串" atIndex:1];
// 3.在末尾追加字符串
[string appendString:@"-baidu.com"];
// 4.删除操作
//删除给定范围的字符
[string deleteCharactersInRange:[string rangeOfString:@"23"]];
//删除所有的字符
//[string setString:@""];
// 5.修改字符串
//1可变字符串-baidu.com
//将 - 修改为 www.
[string replaceCharactersInRange:NSMakeRange(6, 1) withString:@"www."];
//注意:如果给定的范围长度要大于替换字符串的长度时,后面多出的部分会进行删除(先删除再插入)
[string replaceCharactersInRange:NSMakeRange(6, 6) withString:@"www."];
NSLog(@"string: %@",string);
}
6、测试方法
#import "StringTest.h"
@implementation StringTest
+(void)test {
NSLog(@"%@",self);
//[self createString];
//[self appendSeparatedString];
//[self compareString];
//[self otherMethods];
//NSString *string = @“cuixuerui”;
//NSLog(@"%@",[string reverse]);
[self mutableString];
}
@end