首页 > 代码库 > IOS知识点总结 一 (NSString)

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等同于str15 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=http://www.mamicode.com/@"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";//比较时必须判断消息的接受者是否为nilif (str1 && [str1 compare:str2] == NSOrderSame){  NSLog(@"相等");  }

 

IOS知识点总结 一 (NSString)