copy的使用
copy概念
通过copy
方法产生副本的过程
copy规律
可变/不可变对象 –> copy
–> 不可变对象
可变/不可变对象 –> mutablecopy
–>可变对象
copy与mutablecopy
copy(浅复制),只是拷贝指针
mutablecopy(深复制),拷贝内容
,分配新的内存空间
copy与内存管理
- 不可变对象 copy(浅拷贝)
- 只是拷贝地址 没真正分配新的内存空间
- 源对象,引用计数+1
- 副本对象,引用计数也是和源对象一样,
因为指向同一对象内存空间
源对象和副本对象是
同一个对象
不可变对象 mutablecopy(深拷贝 ) 分配新的内存空间
- 分配新的内存空间 存储了新的副本 引用计数为1
- 源对象,引用计数还是为1
- 副本对象,引用计数也是1,`因为是新的内存空间,只有副本对象指向该空间“
- 源对象和副本对象是
两个不同对象
,只是它们的内容相同
@property中的copy关键字
MRC
- copy 只用与NSString\block
- retain 除了NSString\block以外的OC对象
- assign 基本数据类型 枚举 结构体(非OC对象)
- 当两个对象互相引用 一个用retain 另一个用assign
MRC中,retain引用计数+1,相当于浅拷贝,若重新赋值就会修改到原来的值
如果使用retain
的话,代码如下
NSMutableString *str = [NSMutableString string];
[str appendString:@"小明"];
//设置姓名
p.name = str;
NSLog(@"p.name = %@",p.name); //小明
[str appendString:@"&小红"];
NSLog(@"p.name = %@",p.name); //小明&小红
如果使用copy
的话,代码如下
NSMutableString *str = [NSMutableString string];
[str appendString:@"小明"];
//设置姓名
p.name = str;
NSLog(@"p.name = %@",p.name); //小明
[str appendString:@"&小红"];
NSLog(@"p.name = %@",p.name); //小红
ARC
- copy 只用与NSString\block
- strong 除了NSString\block以外的OC对象
- weak 当两个对象互相引用 一个用retain 另一个用weak
- assgin 基本数据类型 枚举 结构体(非OC对象)
为自定义的类实现copy操作
1)创建一个自定义的类
2)遵守NSCopying协议
3)实现协议中声明的方法
- 实现copyWithZone方法,在该方法中返回一个对象的副本
- 在copyWithZone方法中,创建一个新的对象,并设置该对象的数据与现有对象一致,并返回该对象
4)【对象 copy】
目的:产生一个副本对象
自定义对象
的拷贝都是深拷贝
Student.h文件
#import <Foundation/Foundation.h>
@interface Student : NSObject<NSCopying>
@property (nonatomic,strong) NSString *name;
@property (nonatomic,assign) NSInteger age;
@end
Student.m文件
“`
import “Student.h”
@implementation Student
(id)copyWithZone:(NSZone *)zone{
Student *st0 = [Student new];
st0.name = self.name;
st0.age = self.age;return st0;
}
@end
“`
main.m文件
“`
Student *st = [Student new];
NSLog(@”st = %p”,st); //st = 0x100206a50
Student *st1 = [st copy];
NSLog(@”st1 = %p”,st1); //st1 = 0x100206e80
“`
通过打印地址
可以看到,这是两个不同空间的对象
,只是它们的内容是相同的