copy和strong的区别

1.先用代码示例
@interface ViewController ()
@property (strong, nonatomic) NSArray *bookArray1;
@property (copy, nonatomic) NSArray *bookArray2;
@end

@implementation ViewController

  • (void)viewDidLoad {
    [super viewDidLoad];
    [self questionDescribe];
    }

  • (void)questionDescribe {
    NSMutableArray *books = [@[@"我是1"] mutableCopy];
    self.bookArray1 = books;
    self.bookArray2 = books;
    [books addObject:@"你好"];

    NSLog(@"bookArray1(strong) = %@ \n bookArray2(copy) = %@",self.bookArray1, self.bookArray2);
    }

打印出的结果是:bookArray1(strong) = (
"我是1",
"你好"
)
bookArray2(copy) = (
"我是1"
)

2.从上面我们大概能看出来strong和copy的区别了吧?
使用strong,则self.bookArray1与可变数组books指向同一块内存区域,books内容改变,导致self.bookArray1的内容改变,因为两者是同一个东西;而使用copy,self.bookArray2在赋值之前,将books内容复制,创建一个新的内存区域,所以两者不是一回事,books的改变不会导致self.bookArray2的改变。

3.说到底就是不同的修饰符,对应不同的setter方法
(1).strong对应的setter方法,是将_property先release(_property release),然后将参数retain(property retain), 最后是_property = property
(2).copy对应的setter方法,是将_property先release (_property release),然后拷贝参数内容(property copy),创建一块新的内存地址,最后_property = property

4.property的本质?
@property = 实例变量 + getter + setter

5.下划线和self的区别?
下划线只代表实例变量,不调用setter方法和getter方法
self会调用setter和getter方法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容