iOS 属性copy、strong 以及 深浅拷贝

序言

很基础的知识,写一遍只当笔记,加深印象。

正文

知识点1:属性默认关键字

关于ARC下,不显示指定属性关键字时,默认关键字:
1.基本数据类型:atomic readwrite assign
2.普通OC对象: atomic readwrite strong

知识点2:深浅拷贝

浅拷贝:指针拷贝(拷贝出一个新的指针,指向原来的对象)
深拷贝:内容拷贝(拷贝出一个新的指针,指向新的对象)
只有不可变对象使用copy时,是浅拷贝。其他组合方式,均为深拷贝。

iOS 属性copy、strong 以及 深浅拷贝_第1张图片
image.png
知识点3:strong、copy

属性使用strong:指针传递,浅拷贝
属性使用copy:生成一个不可变对象,深拷贝

@interface ViewController ()

@property (nonatomic, strong) NSString *str1;
@property (nonatomic, copy) NSString *str2;

@end

@implementation ViewController

//strong 修饰实现
- (void)setStr1:(NSString *)str1{
    _str1 = str1;
}

//copy 修饰实现
- (void)setStr2:(NSString *)str2{
    _str2 = [str2 copy];
}

应用中产生的区别:
当一个不可变字符串mutStr,赋值给str1、str2后产生的效果一样;
当一个可变字符串,赋值给str1、str2后,再改变可变字符串,此时,str2不随mutStr改变,str1随mutStr改变。
注意:
1.可变对象使用copy修饰后,当可变对象改变时,会发生奔溃;
2.对象A深拷贝后产生新的对象B,B内部的对象b只是对A内部对象进行的浅拷贝,新的指针还是指向之前的内部对象,此时若b发生改变,则A中对应的内部对象也会发生改变。如果想改变这个情况,需要复写对象的- (id)copyWithZone:(NSZone *)zone或者- (id)mutableCopyWithZone:(NSZone *)zone方法,对内部对象进行深拷贝。

扩展:对象的等同性以及如何打印对象地址

内存地址打印
对象的等同性

结束语:

我始终相信编程是一门艺术,不忘初心,方得始终。

参考文章:
iOS 浅谈:深.浅拷贝与copy.strong
属性及其特质
iOS开发 之 不要告诉我你真的懂isEqual与hash!

你可能感兴趣的:(iOS 属性copy、strong 以及 深浅拷贝)