iOS NSString创建解析

来源:互联网 发布:emlog源码下载 编辑:程序博客网 时间:2024/06/06 04:01

     NSString在iOS中很常见,但也是最容易弄错的,下面详细讲解下NSString容易出错的点

流畅的APP一般都是内存控制很棒,因此NSString出错的点也与内存有关,往往也是大家容易忽略的点

比如:表的cell中如果包含很多stringWithFormat的话就会感觉卡卡的,这样其实是可以优化的,但是如何优化就要从里面的本质说起了

1)字符串的创建常用的有3种方式:

     

初始化字符串,方法1(快速初始化)
NSString *string0 =@"niahoma";
NSString *string1 =@"niahoma";

//注意:上面的string0 和string1 是指针和内容都 相等 的。

if(string0 == string1){
NSLog(@"string0和string1是指针和内容都是相等的");
}else{
NSLog(@"string0和string1是指针和内容都是bu相等的");
}

//初始化字符串,方法2
NSString *string2 = [NSString stringWithString:string1];
if(string1 == string2){
NSLog(@"string1和string2是指针和内容都是相等的");
}else{
NSLog(@"string1和string2是指针和内容都是bu相等的");
}
///注意:
// stringWithString 是通过浅拷贝的方式得到字符串string2的,浅拷贝只拷贝指针不拷贝对象,所以其指针是相等的,内容也相等。

// 不可变字符串初始化方法[NSString stringWithString:@“asdf”];已经过时了,在新的Xcode中已经不可用。@“”部分已经改为NSString对象,但是在可变数组中是可用的,如:[NSMutableString stringWithString:@"nihao"];是可行的。

// NSString *string2 = [NSString stringWithString:@"ahdo"];词句在最新的Xcode中已经不可用。

//初始化字符串,方法3

NSString *string3 = [NSString stringWithFormat:@"nihao%@,也可以写中文%d",@"hah",45];
//stringWithFormat可以格式化输入字符串,便于将其他类型转化为字符串类型。
//在下面的初始化字符串中,string4和string5的指针是 不相等 的。

NSString *string4 = [NSString stringWithFormat:@"nihaohah也可以写中文45"];
NSString *string5 = [NSString stringWithFormat:@"nihaohah也可以写中文45"];
if(string4 == string5){
NSLog(@"string4和string5是指针和内容都是相等的");
}else{
NSLog(@"string4和string5是指针和内容都是bu相等的");
}

//在OC中stringWithFormat会新申请一片空间并初始化字符串,所以每一个用stringWithFormat方法得到的字符串其指针都是不相同的;
//而stringWithString是通过浅拷贝的方式得到字符串的,浅拷贝只拷贝指针不拷贝对象,所以其指针是相等的,内容也相等;
//快速初始化是首先根据一定的方法(此方法和NSSet(集合)中的存放对象的方法一样都是hash算法)在内存中查找是否已经存在了这样的一个对象,若是存在则放回此对象的指针,若不存在,则根据一定的方法找到一片内存空间存放对象,并返回指针。

*用常量创建方式,存储指针存储在常量区,不需要内存管理.

*init或类工厂方法创建对象时存储在堆区,需要内存管理,该方式会生成新对象或只是对原有对象进行引用,具体是由xcode版本或是平台(iOS,Mac OS)即编译器决定的,可以自己测试编译器机制.

(1)在initWithString方法中内部机制实际上进行了copy,而copy分为深拷贝和浅拷贝

(2)copy方法又分为copy和mutableCopy,copy默认告诉编译器我要你生成不可变对象,mutable生成可变对象

initWithString:

* 若你传入的是可变对象,接收的是不可变对象或是可变对象,考虑到拷贝的意义(拷贝不会影响源文件,对源文件编辑不会影响拷贝出的文件,对拷贝出的文件编辑不会影响源文件),会是深拷贝,所以编译器肯定会为你创建一个新的对象并返回给你.

* 若你传入的是不可变对象,接受的是不可变对象,考虑到拷贝的意义(不管你需求怎么样,传入和接收的都是不可变的,这个拷贝没有意义,实际上这是编译器的优化),所以这是浅拷贝,不会返回新的对象,但是会让你的指针和传入对象的指针指向同一个对象.

同理,若接收的是可变对象,两个对象性质不一样,就会创建新的对象返回给你,是深拷贝.

(3) 在stringWithFormat中的内部机制实际上是 alloc init了新的对象,所以这个方法不管怎么样,都会返回一个新的对象给你接收

 
               所以很多不太注意的点刚好就是我们的要猜的坑,根据自己的实际情况去操作你的字符串吧

原创粉丝点击