iOS的深拷贝和浅拷贝

1、了解深拷贝和浅拷贝

iOS 里面的浅拷贝:

在 iOS 里面, 使用retain 关键字进行引用计数,就是一种更加保险的浅拷贝。他既让几个指针共用同一片内存空间,又可以在release 由于计数的存在,不会轻易的销毁内存,达到更加简单使用的目的。

iOS 里面的深拷贝:

深拷贝是指拷贝对象的具体内容,而内存地址是自主分配的,拷贝结束之后,两个对象虽然存的值是相同的,但是内存地址不一样,两个对象也互不影响,互不干涉。

2、Objc对象拷贝构造:

  • 在OC中要想自定义的类具有拷贝功能(也就是能用copy方法)则类必须遵守NSCopying协议,并且实现协议中的(id)copyWithZone:(NSZone *)zone方法;
  • 在这个方法中我们可以根据自己的实际情况来实现,不同的实现方式,copy出来的对象具有不同的效果
    类的深/浅拷贝也就是在这个方法中体现,具体如下
  • 同理,NSMutableCopying也是可以按照下面实现。。。

(1)自定义浅拷贝

-(id)copyWithZone:(NSZone *)zone
{
    //创建新的对象空间
    Student *stu = [[self class] allocWithZone:zone];

    //将属性复制---其实只是复制了地址
    stu.name = self.name;
    stu.sex = self.sex;
    stu.age = self.age;

    return stu;
}

(2)自定义深拷贝

-(id)copyWithZone:(NSZone *)zone
{
    //创建新的对象空间
    Student *stu = [[self class] allocWithZone:zone];

    //为每个属性创建新的空间,并将内容复制
    stu.name = [[NSString alloc] initWithString:self.name];
    stu.sex = [[NSString alloc] initWithString:self.sex];
    stu.age = self.age;

    return stu;
}

3、NSString的Copy和MutableCopy

//Copy
NSString *str = @"嘹亮的小浩子";
NSString *str1 = [str copy];
    
NSLog(@"str地址%p ---- str1地址%p",str,str1);
//输出,得出的结果,对NSString进行copy只是指针拷贝
2016-07-18 22:32:06.833 深拷贝和浅拷贝[12603:1256836] str0x1090ea068 ---- str10x1090ea068

//MutableCopy
NSString *str = @"嘹亮的小浩子";
NSString *str1 = [str mutableCopy];

NSLog(@"str地址%p ---- str1地址%p",str,str1);
//输出,得出的结果,对NSString进行MutableCopy进行内容拷贝,生成新的对象

** 以下总结**

iOS的深拷贝和浅拷贝_第1张图片
别人总结的,拿来借鉴以下

未完待续

你可能感兴趣的:(iOS的深拷贝和浅拷贝)