copy 和mutaleCopy

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;
}
时间: 2024-11-25 15:48:56

copy 和mutaleCopy的相关文章

40-oc copy

Copy基本使用(深浅拷贝) "把握:copy 和mutaleCopy 的区别" 使用copy功能的前提是什么 使用copy功能的前提: 需要遵守NSCopying协议,实现copyWithZone:方法 使用mutableCopy功能的前提: 需要遵守NSMutableCopying协议,实现mutableCopyWithZone:方法 如何使用copy功能(重点理解)? 一个对象可以调用copy或mutableCopy方法来创建一个副本对象 copy : 创建的是不可变副本(如NS

使用Second Copy同步ftp服务器的差异文件

公司一直用自主开发的一个同步工具来进行数据库文件异机备份的,但无奈太不稳定,三天两头出现服务挂死的问题,特别是最近这1个月,几天就1次. 问题现象都是服务一直在运行,但没有复制文件到备份机上,而且备份服务重启需要2个小时到2天…… 原因估计是网络问题导致文件共享复制中断,无法结束正在复制文件的这个进程而引起的.具体原因不想深究,那是个无底洞. 所以前天开始,就开始在各大软件网站和论坛中,搜索满足需求的同步软件,要求如下: 软件安装在客户端,通过ftp服务,定期从服务器上下载差异文件 支持设置执行

angular.copy和angular.extend

angular.copy用于深复制,而angular.extend用于拓展.     angular.copy(src,[dst]) src:源对象 dst:目标对象,复制的对象 js中 '= '操作符复制的是指针,所以前后两个变量指向的还是内存中的同一个对象,所以在其中一个变量上操作该对象时,对另外一个变量也会生效.而angular.copy方法是深复制,会在内存中再生成一个对象,两个变量彼此独立,互不影响. 接收一个必须参数src,一个可选参数dst.如果dst没有提供,就会创建对象或者数组

assign,copy,strong,weak,nonatomic的具体理解

例子: NSString *houseOfMM = [[NSString alloc] initWithString:'MM的三室两厅']; 上面一段代码会执行以下两个动作:  1 在堆上分配一段内存用来存储@' MM的三室两厅 ' ,比如:内存地址为 0X1111  内容为 ' MM的三室两厅' ,  2 在栈上分配一段内存用来存储 houseForWife ,比如:地址为 0XAAAA  内容自然为 0X1111 下面分别看下(assign,retain,copy):  1.assign的情

assign, retain, weak, strong, copy,unsafe_unretain

readonly, readwrite:是控制属性的访问权限,readonly只生成getter方法,其他类是无法修改其值的.readwrite是会同时生成getter和setter方法,其他类可以修改其值. assign, retain, weak, strong, copy,unsafe_unretained:在non-ARC中,assign和retain是一组,assign的对象属性引用计数不变,而retain会被+1.对应的在ARC中,weak和strong是一组,weak的对象属性引用

python copy

import copya = [1, 2, 3, 4, ['a', 'b']]  #原始对象b = a  #赋值,传对象的引用c = copy.copy(a)  #对象拷贝,浅拷贝d = copy.deepcopy(a)  #对象拷贝,深拷贝a.append(5)  #修改对象aprint a [1, 2, 3, 4, ['a', 'b'], 5] >>> print b [1, 2, 3, 4, ['a', 'b'], 5] >>> print c [1, 2, 3,

copy, retain, assign , readonly , readwrite,strong,weak,nonatomic整理

copy:建立一个索引计数为1的对象,然后释放旧对象 对NSString对NSString 它指出,在赋值时使用传入值的一份拷贝.拷贝工作由copy方法执行,此属性只对那些实行了NSCopying协议的对象类型有效.更深入的讨论,请参考“复制”部分. retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1对其他NSObject和其子类对参数进行release旧值,再retain新值指定retain会在赋值时唤醒传入值的retain消息.此属性只能用于Objective

如果将synthesize省略,语义特性声明为assign retain copy时,自己实现setter和getter方法

如果将synthesize省略,并且我们自己实现setter和getter方法时,系统就不会生成对应的setter和getter方法,还有实例变量 1,当把语义特性声明为assign时,setter和getter时方法内部实现 - (void)setName:(NSString *)name{ _name = name; } - (NSString *)name{ return _name; } 2,当把语义特性声明为retain时,setter和getter方法内部实现 - (void)set

svn: is already a working copy for a different url 解决办法

svnX    svn: E155000: '/Users/mac/Desktop/SHiosProject/SVNmangerfiles/wuye'   is already a working copy for a different URL 首先说明下原因: 出现这种情况大多是由于原有的目录是使用svn更新的,并且指定了一个更新的url,比如说 http://192.168.10.1/svn/xxx,如果此url由于某种原因无法使用,而换成了http://192.168.10.2/svn/