码迷,mamicode.com
首页 > 其他好文 > 详细

copy 和mutaleCopy

时间:2015-11-26 20:59:20      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:

技术分享

Copy基本使用(深浅拷贝)

把握:copy 和mutaleCopy 的区别

1:使用copy功能的前提是什么?

 

  • 使用copy功能的前提: 需要遵守NSCopying协议,实现copyWithZone:方法
  • 使用mutableCopy功能的前提: 需要遵守NSMutableCopying协议,实现mutableCopyWithZone:方法

2:如何使用copy功能(重点理解)

一个对象可以调用copy或mutableCopy方法来创建一个副本对象

  • copy : 创建的是不可变副本(如NSString、NSArray、NSDictionary)
  • mutableCopy :创建的是可变副本(如NSMutableString、NSMutableArray、NSMutableDictionary)

3:copy基本原则(重点理解)

 

  • 修改源对象的属性和行为,不会影响副本对象
  • 修改副本对象的属性和行为,不会影响源对象

4:为什么通过不可变对象调用了copy方法, 不会生成一个新的对象?

 

  • 因为原来的对象是不能修改的, 拷贝出来的对象也是不能修改的
  • 既然两个都不能修改, 所以永远不能影响到另外一个对象, 那么已经符合需求
  • 所以: OC为了对内存进行优化, 就不会生成一个新的对象

copy内存管理

1:浅拷贝和深拷贝的区别?本质是什么?

 

1.浅复制(浅拷贝,指针拷贝,shallow copy)

  • 源对象和副本对象是同一个对象
  • 源对象(副本对象)引用计数器+1,相当于做一次retain操作
  • 本质是:没有产生新的对象

2.深复制(深拷贝,内容拷贝,deep copy)

  • 源对象和副本对象是不同的两个对象
  • 源对象引用计数器不变,副本对象计数器为1(因为是新产生的)
  • 本质是:产生了新的对象

copy和property

1:@property中的copy的作用是什么?

 

  1. 防止外界修改内部的数据
  2. 可以使用copy保存block, 这样可以保住block中使用的外界对象的命
  3. block默认存储在栈中, 栈中的block访问到了外界的对象, 不会对对象进行retain

2:@property内存管理原则?

 

MRC

  1. copy : 只用于NSString\block
  2. retain : 除NSString\block以外的OC对象
  3. assign :基本数据类型、枚举、结构体(非OC对象),当2个对象相互引用,一端用retain,一端用assign

ARC

  1. copy : 只用于NSString\block
  2. strong : 除NSString\block以外的OC对象
  3. weak : 当2个对象相互引用,一端用strong,一端用weak
  4. assgin : 基本数据类型、枚举、结构体(非OC对象)

3:如何解决block中的循环引用?

如果对象中的block又用到了对象自己, 那么为了避免内存泄露, 应该将对象修饰为__block

__block Person *p = [[Person alloc] init]; // 1
p.name = @"lnj";
NSLog(@"retainCount = %lu", [p retainCount]);

p.pBlock = ^{
    NSLog(@"name = %@", p.name); // 2
};
NSLog(@"retainCount = %lu", [p retainCount]);
p.pBlock();

 

 

20.自定义类实现Copy

1:自定义类如何实现copy操作?

 

  1. 以后想让自定义的对象能够被copy只需要遵守NSCopying协议
  2. 实现协议中的- (id)copyWithZone:(NSZone *)zone
  3. 在- (id)copyWithZone:(NSZone *)zone方法中创建一个副本对象, 然后将当前对象的值赋值给副本对象即可
- (id)copyWithZone:(NSZone *)zone
{
    // 1.创建一个新的对象
    Person *p = [[[self class] allocWithZone:zone] init];

// 2.设置当前对象的内容给新的对象
    p.age = _age;
    p.name = _name;

// 3.返回新的对象
    return p;
}

 

- (id)mutableCopyWithZone:(NSZone *)zone
{
    // 1.创建一个新的对象
    Person *p = [[[self class] allocWithZone:zone] init];

// 2.设置当前对象的内容给新的对象
    p.age = _age;
    p.name = _name;

// 3.返回新的对象
    return p;
}

 

copy 和mutaleCopy

标签:

原文地址:http://www.cnblogs.com/dreamWanweidong/p/4998808.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!