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