iOS assign 和 weak ,copy(深拷贝,浅拷贝)

iOS assign 和 weak ,copy(深拷贝,浅拷贝)

assign

1:修饰基本数据类型,如 int

2:修饰对象类型,不改变其引用计数

3:被assign指向的对象,再被释放之后,assign指针仍然指向原来的对象内存地址,如果通过assign指针继续访问原来的对象,会出现内存泄漏的问题

weak

1:不改变被修饰对象的引用计数

2:所指对象在被释放之后会自动置为 nil

区别:

1;assign既可以修饰对象也可以修饰基本数据类型,weak 只能修饰对象

2:assign指向对象被释放后,仍然指向原来的内存地址,weak则自动置为nil。

共同点:

都不改变修饰对象的引用计数

copy

浅拷贝:

就是对内存地址的复制,让目标对象和源对象指向同一片内存空间

1:浅拷贝会增加被拷贝对象的引用计数

2: 没有新的内存分配,因为两个指针指向的是同一块内存空间

深拷贝:

让目标对象和源对象指向两块内容相同的内存空间,会有内存空间的创建,然后用新的指针指向新的内存空间,两个指针指向连个内存空间,但是内容相同。

1:不会增加被拷贝对象的引用计数

2:产生内存分配,因为新分配内存

区别:

1.深拷贝开辟了新的内存空间,浅拷贝没有

2:是否影响引用计数,深拷贝不会,浅拷贝会影响

--- --- --- ---
源对象类型 拷贝方式 目标对象类型 深/浅
mutable copy 不可变 深拷贝
mutable mutableCopy 可变 深拷贝
immutable copy 不可变 浅拷贝
immutable mutableCopy 可变 深拷贝

总结:

1.可变对象无论是copy还是mutableCopy都是深拷贝

2.不可变对象进行copy为浅拷贝,mutableCoopy为深拷贝

3。copy方法返回的都是不可变对象

例子:

如:@property(copy)NSMutableArray *arr;

这样arr被copy修饰,如果赋值过来的是NSMutableArr,被copy之后变成NSArray,为不可变的,如果进行添加删除的操作会崩溃s

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