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
网友评论