IOS知识点总结 一 (NSString)

objective-c中用NSString的有关注意事项:

一:声明NSString类型的属性格式


//属性声明为copy,是为传入的参数若是NSMutableString类型的数据做copy处理,使外界参数的改变不影响属性的值。

1 @property (nonatomic,copy) NSString *str;

二:NSString创建

//方法一 str1指针变量指向内存中 文字常量区 的 @"abc" 这个地址。
NSString *str1=@"abc";

//方法二 虽然用得是alloc方法,但并不是在内存的堆区申请内存,而是在 文字常量区 申请内存。
NSString *str2=[[NSString alloc] initWithString:@"abc"];

//方法三(方法三 和 方法一 在Xcode中被认为是等效的,如果写第三种方法,则Xcode会建议写成第一种方法)
 NSString *str3=[NSString stringWithString:@"abc"];

//方法四虽没有alloc,但系统会在 堆区 申请内存,引用计数初始化为1.
 NSString *str4=[NSString stringWithFormat:@"abc"];

//方法五用alloc方法,在 堆区 申请内存,引用计数初始化为1.
 NSString *str5=[[NSString alloc] initWithFormat:@"abc"];

1.在 文字常量区 的地址分配规则:只要值相等,则共用相同的内存区域,那么str1和str2的内存地址是一样的。

2.在 文字常量区 的字符串的 retainCount 被设置为一个非常大得数,所以对处在文字常量区的字符串变量进行 retain 或 release 操作都等同于无效,

这些字符串常量在程序运行过程中一直存在,当程序结束时统一由系统回收管理。

3.str4 和 str5都是在堆区申请内存,只要是在堆区申请的内存,就会有引用计数,两种方法初始化的retainCount都设置为1,虽然两个方法的值都是@"abc",但方法四和方法五在堆区的内存地址是不一样的,即str4和str5是堆区的两块内存区域。

三:NSString的copy和mutableCopy机制

1.不可变字符串的两种copy方式

1 //源字符串
2 NSString *str1=@"abc";
3 
4 //不可变复制,str2和str1都指向 常量区 的@"abc"字符串,str2等同于str1
5 NSString *str2=[str1 copy];
6  
7 //可变的复制,此方法在堆区申请内存,复制str1的值。有引用计数,但str3是不可变字符串。
8 NSString *str3=[str1 mutableCopy];

2.可变字符串的两种copy方式

//源字符串,创建于堆区
NSMutableString *str1=[NSMutableString string];
[str1 appendString:@"abc"];

//不可变复制
NSString *str2=[str1 copy];

//可变的复制
NSString *str3=[str2 mutableCopy];

str1,str2和str3都在堆区,都有引用计数,retainCount的值为1。

str2和str3都是不可变的字符串。

四:NSString和c字符串的转换

在源代码中NSString字符串是以@开头的,如:@"abc"

在objective-c中c的字符串直接就是引号:"abc"

1.c串 => NSString串 代码示例:

1 //c字符串
2 char *s="abc";
3 
4 //用类方法转换
5 NSString *str=[NSString stringWithCString:s encoding:NSUTF8StringEncoding];
6 
7 //用初始化方法转换
8 NSString *str1=[[NSString alloc] initWithCString:s encoding:NSUTF8StringEncoding];

两种方法转换的NSString都创建在 堆区 ,都有引用计数。

2.NSString串 => c串 代码示例:

//源字符串 
NSString *str=@"abc";

//方法一
const char *s1=[str UTF8String];

//方法二
const char *s2=[str cStringUsingEncoding:NSUTF8StringEncoding];

两种方法的返回值的设定必须是const char * 类型的。

五:字符串和数组的转换

1.字符串转换为数组

//字符串
NSString *data=@"15,13,18,9,23";

//数组
NSArray *temp=[data componentsSeparatedByString:@","];

2.数组转换为字符串

//数组
NSArray *arr=@[@"1",@"2",@"3"];

//字符串
NSString *str=[arr componentsJoinedByString:@","];

六:字符串的比较

NSString *str1=nil;
NSString *str2=@"this is a string";

//比较时必须判断消息的接受者是否为nil
if (str1 && [str1 compare:str2] == NSOrderSame)
{
  NSLog(@"相等");  
}

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。