OC语言基础七:字符串数据类型NSString


清楚系统提供了那些接口,可以实现哪些操作。

不可变字符串

一:创建

指的字符串的内容和长度不可变
NSString *string=[[NSString alloc]init];是没有意义的,因为这样取开辟出来的不可变对象空间,后续对字符串内容的添加是不可能完成的,因为字符串的内容和长度不可变。

NSString *string=[[NSString alloc]init];
NSLog(@"%p,%@",string,string);
string=@"hello world";
NSLog(@"%p,%@",string,string);
NSSting * string2=@"hello world";
NSLog(@"%p,%@",string,string);

前两次的地址是不一样的,第二次和第三次的地址是一样的。
第一次string内容是空的,第二次string内容是hello world

因为OC字符串的享元模式,可以节省内存资源,OC字符串创建的时候比较消耗内存,当创建不可变字符串的时候,系统会自动把那个常量放到数据缓冲区,当下一次使用的时候,它发现你是使用的相同的字符串内容,就会从缓冲区内把数据取出,无需创建新的对象。

1.C语言字符串转换成OC字符串对象

NSSting * string2=@"hello world";
NSLog(@"%p,%@",string,string);

const char *cString="utf-8 string"
string2=[[NSString alloc]initWithCString:cString encoding:NSUTF8StringEncoding];
NSLog(@"%p,%@",string,string);

或string2=[NSString stringWithCString:cString encoding:NSUTF8StringEncoding];

发现内存空间地址变了,string2指向的是另外一个对象,而且字符串的内容也发生了变化。

2.格式化字符串

string2=[NSString stringWithFormat:@"%@年%@月%@日",@"1970",@"1",@"1"];

二:拼接和分割

拼接

NSString *string1=@"www.";
NString *string2=@"baidu.com";
NSString string3=[NSString stringWithFormat:@"%@%@",string1,string2];

或用这种方式比如在string3后面拼接一段字符串

string3=[string3 stringByAppendingString:@"(百度网址)")]
string3=[string3 stringByAppendingFormat:@"%d年",1970];

分割

按字符串分割,后面的必须是我们已经有的字符串。返回的是一个数组对象,返回的中文是Unicode的编码形式。

NSArray *components=[string3 componentsSeparatedByString:@"."];
components=[string3 componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString@".()"]];//将.()放到字符集合中,string3按.()三个符号分割字符串

获取长字符串中的某一段子串,结果中文仍然是中文:

NSString *substring =[string3 substringFromIndex:5];//从第五个元素开始取,返回结果包括第五个元素(下标从0开始数)
substring =[string3 substringToIndex:5];//取到5位置为止,返回结果并不包括最终的临界值5.
substring =[string3 substringWithRange:NSMakeRange(2,5)];//从2开始取,取5个字符长度,返回结果包括第2个元素。

字符串比较

NSString *string1=@"hello";
NSString*string2=@"hello";
if(string1==string2){
  NSLog("等于");
}else{
    NSLog("不等于");
}

string1和string2是指针,存的都是hello这个字符串常量的内存地址,所以会打印等于。但是在字符串比较的时候千万不要用这种方式,不可靠的。
用下面这种方式:

if([string1 isEqualToString:string2]){
    NSLog("等于");
}else{
    NSLog("不等于");
}

如果用stringWithFormat创建出的字符串,无论是否是之前使用过的字符串常量,都会新开辟出一个内存空间存放这个字符串的内容。并不会采用享元模式。
string2=[NSString stringWithFormat:@“hello”];
这样,第一种方法就会输出不等于,而第二种方法就会输出等于。
3.

string1=@"abc";
string2=@"abcd";
NSComparisonResult  result=[string1 compare:string2];
switch(result){
 case NSOrderedAscending://升序
         NSLog(@"string1<string2");
         break;
  case NSOrderedSame:
         NSLog(@"string1=string2");
         break;
   case NSOrderedDescending://降序
         NSLog(@"string1>string2");
         break;      
}

返回结果是NSComparisionResult,有三个枚举值分别是升序降序还有相同。依次比较字符串中的ASCII码值,看是否相同,如果相同就继续往下比,如果比较到某一个比较大或小,就不会继续往下比较了,会直接返回结果。如果比较发现其中一个字符串已经到了最大长度,而另一个字符串后面还有字符存在,那么就会按字符串的长度进行比较了。

也可以用compare的方法来比较两个字符串是否相同。

其他方法

1.字符长度:

NSString *string=@"www.baidu.com";
NSLog("length=%zd",string.length);

2.字符里的字母都转换成大写:

NSLog(@"upper:%@",string.uppercaseString);

小写:lowercaseString

3.检验前缀:

BOOL result=[string hasPrefix:"www"];//检查是否有www的前缀,用此方法经常可以完成一些网址,手机号之类的判断
if(result){
   NSLog("YES");
}else{
     NSLog("NO");
}

后缀:hasSuffix

4.字符串中某段子串的范围

NSRange range=[string rangeOfString:@"baidu"];
NSLog(@"%@",NSStringFormRange(range));//直接打印结构体比较麻烦,所以转换成字符串打印。输出(4,5)从下标4开始,长度是5.

可变字符串

NSMutableString继承自NSString,所以也可以使用NSString的方法。

1.创建

NSMutableString *string=[[NSMutableString alloc]init];
可变指的是内存空间是可以被更改的,所以先创建一个空的可变字符串出来,后期再添加内容是没有问题的。

2.赋值

不能这样赋值:string=@“string”;类型首先就不匹配
可以这样:

[string setString:@"可变字符串"];

字符串清空:

[string setString:@""];

但不能传nil:[string setString:nil];会直接报错

3.追加字符串

[string appendString:@"www.baidu.com"];

4.插入字符串

[string insertString:@"(百度网址)" atIndex:4];

5.删除字符串

string deleteCharactersInRange:[string rangeOfString:@"(百度网址)"];

直接数可能数的不准确,所以可以用获取范围的函数

6.修改字符串内容

[string replaceCharactersInRange:NSMakeRange(0,5) withString:@"123"];//从下标0开始长度是5的字符串替换成123。后面的字符串长度和前面的范围没有关系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值